WPF - 从代码

时间:2018-02-10 13:06:45

标签: c# wpf fluent-ribbon

这是我的问题:我使用Fluent功能区创建了一个程序,当我想禁用功能区时,我需要使用以下代码:

代码WPF:

<Fluent:RibbonGroupBox x:Name="GpRibbonFormats" ...>
  <Fluent:Button x:Name="AjoutTole" Header="{x:Static p:Resources.Ajouter}">
    <Fluent:Button.ToolTip>
      <Fluent:ScreenTip x:Name="ScreenTipAjoutTole"...>    
      </Fluent:ScreenTip>
    </Fluent:Button.ToolTip>
  </Fluent:Button>
  <Fluent:Button x:Name="EditQtyFormat" ...>
    <Fluent:Button.ToolTip>
      <Fluent:ScreenTip x:Name="ScreenTipEditQtyFormat"...>
      </Fluent:ScreenTip>
    </Fluent:Button.ToolTip>
  </Fluent:Button>
  <Fluent:Button x:Name="DeleteFormat" SizeDefinition="Large">
    <Fluent:Button.ToolTip>
      <Fluent:ScreenTip x:Name="ScreenTipDeleteFormat" ...>
      </Fluent:ScreenTip>
    </Fluent:Button.ToolTip>
  </Fluent:Button>
</Fluent:RibbonGroupBox>

代码背后:

AjoutTole.IsEnabled = false;
ScreenTipAjoutTole.DisableReason = isBlocked;
EditQtyFormat.IsEnabled = false;
ScreenTipEditQtyFormat.DisableReason = isBlocked;
DeleteFormat.IsEnabled = false;
ScreenTipDeleteFormat.DisableReason = isBlocked;

它运行正常,但我想创建一个这样的函数,所以我相信我总是在DisableReason中发送正确的信息:

DisableButton(Fluent:Button NameOfButton,string ReasonOfDisable)
{
    NameOfButton.IsEnabled = false;
    NameOfButton.AllScreenTipChild.DisableReason=ReasonOfDisable
}

我想要禁用所有按钮组的方式相同:

DisableGroup(Fluent:RibbonGroupBox myGroup,string ReasonOfDisable)
{
    foreach(Fluent:Button button in myGroup)
    {
        button.isEnable=false;
        button.AllScreenTipChild.DisableReason=ReasonOfDisable;
    }
}

这样的事情怎么可能?我希望能够从代码隐藏中做到这一点。

编辑:

当我尝试获取按钮的子节点时,我返回一个System.Windows.Controls.Border类型的元素,其名称为&#34; border&#34;,但我没有这样的元素我的XAML文件。 我也试图让我的RibbonGroupBox的孩子,但在这种情况下,我返回一个网格(grid2),并且该网格甚至不在功能区...

使用的代码:

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(DeleteOL); i++)
{
   var child = VisualTreeHelper.GetChild(DeleteOL, i);
   string monType = child.GetType().ToString();
   if(monType== "System.Windows.Controls.Border")
   {
      System.Windows.Controls.Border bb = (System.Windows.Controls.Border)child;
      string name = bb.Name;
   }
}

编辑2:

我确认getChild不能在功能区上工作(为什么?),但我可以找到如何获取组中的按钮列表:

foreach(var item in GpRibbonFormats.Items)
{
    if(item.GetType().ToString()=="Fluent.Button")
    {
         Fluent.Button button = (Fluent.Button)item;
         button.IsEnabled = false;
    }
}

现在我仍然在寻找如何找到按钮的屏幕提示

2 个答案:

答案 0 :(得分:2)

您似乎混合了XAML和C#的命名空间约定,在C#中您不使用:来引用命名空间,而是使用.分隔符。例如,StackPanel位于System.Windows.Controls命名空间内,因此您可以在C#中这样引用它:

System.Windows.Controls.StackPanel stackPanel = new System.Windows.Controls.StackPanel();

我从未尝试过Fluent,但这段代码应该有用。

    public void DisableGroup(Fluent.RibbonGroupBox ribbonGroup, string reasonOfDisable)
    {
        foreach (var item in ribbonGroup.Items)
        {
            if (item is Fluent.Button)
            {
                DisableButton((Fluent.Button)item, reasonOfDisable);
            }
        }
    }

    public void DisableButton(Fluent.Button button, string reasonOfDisable)
    {
        button.IsEnabled = false;

        if (button.ToolTip is Fluent.ScreenTip)
        {
            Fluent.ScreenTip screenTip = (Fluent.ScreenTip)button.ToolTip;
            screenTip.DisableReason = reasonOfDisable;
        }
    }

要停用整个群组,请将其称为

    DisableGroup(GpRibbonFormats, "Ce groupe n'est pas disponible");

要仅禁用一个按钮,您可以像这样调用它

    DisableButton(AjoutTole, "Ajouter est désactivé pour le moment");

顺便说一句,Fluent.RibbonGroupBox继承自ItemsControl,此控件有自己的IsEnabled属性,你可以通过将属性设置为false来禁用整个组(我是虽然没有测试过,但你必须通过每个按钮来设置他们的屏幕提示。

    GpRibbonFormats.IsEnabled = false;

对于这种事情,Binding在WPF中非常强大,你可能想在MVVM上阅读一下。一开始实现起来并不容易,但是一旦掌握了它,它就会改变游戏规则并真正简化你的代码和逻辑。

答案 1 :(得分:1)

花了我些时间,但是我终于了解了用户想要向我解释的内容(对于以MVVM开始的人来说并不明显,这就是为什么我在这里写它)。

我相信我可以轻松地在代码中将属性IsEnabled设置为true或false(如Roger Leblanc的回答),然后继续绑定ViewModel。 并非如此,因为当我将IsEnable(设置为true)属性时,它会将 IsEnabled =“ {Binding EnableEditNesting}” 替换为 IsEnabled = true ,因此之后完成更多的绑定(如果我做错了,请告诉我)。

最后,我做了以下事情:

  • 对于不需要每个按钮具有不同行为的GroupBox,我只需在其IsEnable参数上设置一个绑定。

     <Fluent:RibbonGroupBox x:Name="GpRibbonFormats" IsEnabled="{Binding EnableGpRibbonFormats}" Header="{x:Static p:Resources.Stock}">
           <Fluent:RibbonGroupBox.ToolTip>
                 <Fluent:ScreenTip x:Name="ScreenTipGpRibbonFormats" Image="img\image_engrenage.png" Width="250" Text="{x:Static p:Resources.NestingSendToProduction}" DisableReason="{Binding EnableGpRibbonFormatsReason}">
    
                 </Fluent:ScreenTip>
           </Fluent:RibbonGroupBox.ToolTip>
           <Fluent:Button x:Name="AjoutTole" SizeDefinition="Large" LargeIcon="img\image_add.png" Header="{x:Static p:Resources.Ajouter}" Click="Add_ToleOL_Click">
    
           </Fluent:Button>
                    ...
     </Fluent:RibbonGroupBox>
    
  • 对于需要在每个按钮上执行特定操作的GrouBox,我为每个按钮(该组中没有任何东西)都设置了一个Binding,当我需要禁用所有组时,然后按以下方式禁用按钮:一个。

    <Fluent:RibbonGroupBox x:Name="GpRibbonOL" Header="{x:Static p:Resources.NestingLaunchingOrder}">
         <Fluent:Button x:Name="DeleteOL" IsEnabled="{Binding EnableDeleteOL}" SizeDefinition="Large" LargeIcon="img\image_delete.png" Header="{x:Static p:Resources.Supprimer}" Click="Supprimer_OF">
              <Fluent:Button.ToolTip>
                  <Fluent:ScreenTip x:Name="ScreenTipDeleteOL" Image="img\image_delete.png" Title="Delete OL" Width="250" Text="Delete element" DisableReason="{Binding EnableEditNestingReason}">
                  </Fluent:ScreenTip>
              </Fluent:Button.ToolTip>
         </Fluent:Button>
         ...
    </Fluent:RibbonGroupBox>
    

ViewModel看起来像这样,所以当我要启用/禁用时,我只需更改工具提示:

    private bool enableGpRibbonNesting;
    public bool EnableGpRibbonNesting
    {
        get { return enableGpRibbonNesting; }
        set
        {
            enableGpRibbonNesting = value;
            this.NotifyPropertyChanged("EnableGpRibbonNesting");
        }
    }
    private string enableGpRibbonNestingReason;
    public string EnableGpRibbonNestingReason
    {
        get { return enableGpRibbonNestingReason; }
        set
        {
            enableGpRibbonNestingReason = value;
            if (value == "")
            {
                EnableGpRibbonNesting = true;
            }
            else
            {
                EnableGpRibbonNesting = false;
            }
            this.NotifyPropertyChanged("EnableGpRibbonNestingReason");

        }
    }