代码之家  ›  专栏  ›  技术社区  ›  citronas

如何将RibbonControlLibrary功能区事件机制与TabControl结合使用?

  •  2
  • citronas  · 技术社区  · 14 年前

    我将MicrosoftsRibbonControl库用于一个带有多个RibbonCommand的Ribbonmenu。我有一个TabControl,它应该包含每个按下的功能区按钮的选项卡。例如,我单击RibbonCommand 2,我希望创建一个名为“Tab2”的选项卡,如果它还没有出现在TabControl中,则应该将其集中。

    我已经实现了 http://www.codeproject.com/KB/WPF/WpfTabCloseButton.aspx ,非常好。

    我是这样执行命令的:

    <Window.CommandBindings>
      <CommandBinding Command="me:AppCommands.Protokoll" Executed="RibbonButton_Click" /> 
    </Window.CommandBindings>
    

    RibbonControl中的按钮如下所示。

    <r:RibbonButton Command="me:AppCommands.Protokoll" />
    

    public class AppCommands
    {
      public static RibbonCommand Protokoll
      {
         get { return (RibbonCommand)Application.Current.Resources["ProtokollCommand"]; }
       }
    }
    

    资源字典:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary">
        <r:RibbonCommand x:Key="ProtokollCommand"                
            LabelTitle="foo"
            ToolTipTitle="foo"
            ToolTipDescription="foo" />
    </ResourceDictionary>
    

    我现在要写的是一个方法,它为每个按钮单击创建一个选项卡,因为创建的tabpage包含特定的usercontrols。我不知道如何最好地实现CommandButtons和tab之间的映射。我认为最好只使用一次点击事件处理程序,而不是每个按钮都使用一个事件处理程序。 问题:

    1) 我做过这样的事:

    private void RibbonButton_Click(object sender, RoutedEventArgs e)
    {
      // ((Microsoft.Windows.Controls.Ribbon.RibbonCommand)(((System.Windows.Controls.Button)(e.OriginalSource)).Command))
    }
    

    我不想创建一个基于属性的映射,比如LabelTitle,它应该用于显示。

    2) WPF/C#: How does one reference TabItems inside a TabControl? 它演示了如何查询TabControl的Items集合。这是一个好的尝试还是有更好的尝试?

    3)
    如何在RibbonCommand和应显示的TabPage+控件之间创建映射。我当然可以用像这样的字典

    Dictionary<String, fooContainer>
    // ...
    public class fooContainer()
    {
      public String TabHeaderString {get;set;}
     // other properties
    }
    

    或者WPF是否提供了一个更好的方法来处理这些资源字典,我到目前为止还没有理解。

    1 回复  |  直到 7 年前
        1
  •  2
  •   BladeWise    14 年前

    因为你用的是 Command 要管理选项卡,我想您可以设置 CommandParameter Button 以一种有意义的方式,这样就有可能区分你需要实现的不同行动(即,它可能是一个 Enum ,如果您已经知道需要公开的选项卡类型,或者知道更复杂的对象(如果可以动态创建此类选项卡)。

    顺便说一下 RibbonButton_Click 方法在我看来不正确,因为传递给该方法的参数应该是类型 ExecutedRoutedEventHandler . 这样做将允许您访问 指定在 按钮 Parameter 财产 args 变量。 遵循要修改的代码:

    RibbonButton

    <r:RibbonButton Command="me:AppCommands.Protokoll" CommandParameter="TabKind.Sample1"/>
    <r:RibbonButton Command="me:AppCommands.Protokoll" CommandParameter="TabKind.Sample2"/>
    

    2. 将处理程序更改为 Execute 事件,以匹配适当的签名,并根据需要处理参数

    private void RibbonButton_Click(object sender, ExecutedRoutedEventArgs e)
    {
      TabKind kind = (TabKind)e.Parameter;
      switch (kind)
      {
           case TabKind.Sample1:
           {
               //Do something meaningful...
               break;
           }
           case TabKind.Sample2:
           {
               //Do something meaningful...
               break;
           }
      }
    }
    

    要直接回答您的问题:

    您不需要知道哪个按钮实例引发了 命令 命令参数 确定您要执行的操作类型 色带按钮 只是节目的主持人 命令

    如果你真的需要查询 TacControl TabItem 孩子们,你们提供的链接当然是正确的。

    3. 一旦确定了需要执行的操作,就可以检索 标签项目 您需要通过您以前创建的寄存器(即,您可以有一个适当的 Dictionary 用于关联 枚举 标签项目 实例)。另一种可能的方法是使用 Tag 标签项目 ,将其设置为适当的 枚举 值并使用以下方法检索正确的 (注意 kind 是前面代码段中定义的变量):

    TabItem matchingItem = tab_main.Items.Cast<TabItem>()
                                         .Where(item => item.Tag == kind)
                                         .FirstOrDefault();