gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:46:45 24 4
gpt4 key购买 nike

我将 Microsoft 的 RibbonControlLibrary 用于带有多个 RibbonCommand 的功能区菜单。我有一个 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" />

AppCommands.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>

我现在想写的是一个为每次按钮点击创建一个标签的方法,因为创建的标签页包含特定的用户控件。我不知道如何最好地实现命令按钮和选项卡之间的映射。我认为最好只使用一个单击事件处理程序,而不是为每个按钮使用一个事件处理程序。问题:

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#: 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 是否提供了一种更好的方法来处理这些 ResourceDictionaries,直到现在我还没有理解。

最佳答案

由于您使用 Command 来管理选项卡,我想您可以以有意义的方式设置每个 ButtonCommandParameter 属性, 这样就可以区分您需要实现的不同操作(即它可以是一个 Enum,如果您已经知道您需要公开的选项卡类型,或者是一个更复杂的对象如果可以动态创建此类选项卡)。

顺便说一下,RibbonButton_Click 方法的签名在我看来不正确,因为传递给该方法的参数应该是 ExecutedRoutedEventHandler 类型。这样做将允许您通过 argsParameter 属性访问在 Button 级别指定的 CommandParameter多变的。按照代码修改:

1. 将适当的CommandParameter 添加到您的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;
}
}
}

直接回答你的问题:

1. 您不需要知道哪个按钮实例触发了Command,正确的方法是使用CommandParameter确定您要执行哪种操作(RibbonButton 只是 Command 的宿主,对我来说设计应用程序的逻辑没有意义具体的 UI 实现)。

2. 如果您确实需要查询 TacControlTabItem 子项,您提供的链接当然是最佳选择.

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

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

关于c# - 如何将 RibbonControlLibrary 功能区事件机制与 TabControl 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3222655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com