我将 Microsoft 的 RibbonControlLibrary 用于带有多个 RibbonCommands 的 Ribbonmenu。我有一个 TabControl,它应该包含每个按下的功能区按钮的选项卡。例如,我单击 RibbonCommand 2,我希望创建一个名为“Tab2”的选项卡,如果它尚未出现在 TabControl 中,否则它应该被聚焦。
我已经实现了http://www.codeproject.com/KB/WPF/WpfTabCloseButton.aspx,非常好。
我想我仍然没有完全正确地理解 WPF 的事件机制。我的代码强烈适应了 Ribboncontrol 的示例项目。
这就是我实现命令的方式:
<Window.CommandBindings>
<CommandBinding Command="me:AppCommands.Protokoll" Executed="RibbonButton_Click" />
</Window.CommandBindings>
RibbonControl 内的按钮如下所示。
<r:RibbonButton Command="me:AppCommands.Protokoll" />
应用命令.cs
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>
我现在要编写的是一个方法,它为每个按钮单击创建一个选项卡,其中创建的选项卡页包含特定的用户控件。我不知道,如何最好地实现 CommandButtons 和 Tabs 之间的映射。我认为最好只使用一个单击事件处理程序而不是每个按钮的事件处理程序。 问题:
1)我怎样才能找出哪个独特的按钮引发了事件?我只设法在 ResourceDictionary 中获取信息。不幸的是,没有诸如 uniqueID 之类的属性。我已经这样做了:
private void RibbonButton_Click(object sender, RoutedEventArgs e)
{
// ((Microsoft.Windows.Controls.Ribbon.RibbonCommand)(((System.Windows.Controls.Button)(e.OriginalSource)).Command))
}
我不想基于应该显示的 LabelTitle 之类的属性创建映射。
2) 我发现了这个WPF/C#:如何在 TabControl 中引用 TabItems?它向我展示了如何查询 TabControl 的 Items 集合。这是一个好的尝试还是有更好的尝试?
3)
我应该如何创建应该显示的 RibbonCommand 和 TabPage + 控件之间的映射。当然我可以使用像
Dictionary<String, fooContainer>
// ...
public class fooContainer()
{
public String TabHeaderString {get;set;}
// other properties
}
或者 WPF 是否为这些 ResourceDictionaries 提供了一种更好的方法,我直到现在还没有理解。