3

我将 Prism 与 Microsoft WPF Ribbon 一起使用,一切正常,但我遇到了上下文选项卡的问题。我在 Shell.xaml 中定义上下文选项卡:

<Ribbon:Ribbon.ContextualTabGroups>
    <Ribbon:RibbonContextualTabGroup Header="CTG1" Visibility="Visible" Background="Red" />
    <Ribbon:RibbonContextualTabGroup Header="CTG2" Visibility="Visible" Background="Blue" />
    <Ribbon:RibbonContextualTabGroup Header="CTG3" Visibility="Visible" Background="Purple" />
    <Ribbon:RibbonContextualTabGroup Header="CTG4" Visibility="Visible" Background="Green" />
    <Ribbon:RibbonContextualTabGroup Header="CTG5" Visibility="Visible" Background="Orange" />
    <Ribbon:RibbonContextualTabGroup Header="CTG6" Visibility="Visible" Background="Violet" />
</Ribbon:Ribbon.ContextualTabGroups>

这样,在我的模块中,我可以参考那些上下文选项卡组,并且效果很好。但我想在模块中定义 contextualtabgroups。我想定义一个区域:

<Ribbon:Ribbon.ContextualTabGroups x:Name="RibbonContextualTabs" prism:RegionManager.RegionName="RibbonContextualTabs" />

然后在我的模块中,我将有一个 UserControl,它为每个继承 RibbonContextualTabGroup 并将它们注册到该区域......有没有办法只用一些 ContextualTabGroups 定义一个用户控件并将它们作为一个整体添加?例如:

<Ribbon:RibbonContextualTabContainer x:Class="Views.ContextualTabsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:Ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary">
    <Ribbon:RibbonContextualTabGroup Header="CTG1" Visibility="Visible" Background="Red" />
    <Ribbon:RibbonContextualTabGroup Header="CTG2" Visibility="Visible" Background="Blue" />
    <Ribbon:RibbonContextualTabGroup Header="CTG3" Visibility="Visible" Background="Purple" />
</Ribbon:RibbonContextualTabContainer>

作为 ContextualTabsView.xaml 并在我的模块中制作一个

_regionManager.RegisterViewWithRegion("RibbonContextualTabs", typeof (ContextualTabsView));

我不知道我是否清楚自己要完成的工作,但我将不胜感激。

谢谢。

4

1 回答 1

2

前段时间我遇到了同样的问题(但我使用的是 Teleriks Ribbon Bar)。我找不到从模块添加选项卡的任何方法,或者从 XAML 中添加选项卡的方法更少。

我所做的是这样的服务:

public class RibbonService
{
    public PrioritySet<RibbonTab> Tabs { get; private set; }
    public PrioritySet<object> QuickAccess { get; private set; }
    public PrioritySet<ContextualGroup> ContextualGroup { get; private set; }
}

该类具有以下结构:

上述类别的图表

这里的关键是类 PrioritySet,为了更简单,它只是一个集合,其中每个项目都有一个关联的优先级。

现在,如果在您的框架上注册了这样的服务,那么您可以从模块中添加选项卡。请记住,您的 shell 项目需要获取 RibbonService,然后将项目集合绑定到 Tabs 属性 - 请注意,PrioritySet 实现 INotifyCollectionChanged,因此如果绑定了功能区,它的项目将自动更新。

此外,您还可以获得一些有趣的东西,例如从服务中组成标签。例如,一个模块可能只需要向功能区添加一个按钮,这很容易做到

_ribbonService.Tabs.Add(new RibbonButton(){Header = "Button", Icon = new Uri("icon.png")})

在我的应用程序中,我有选项卡 > 组 > 按钮,因此每个模块都可以完全控制功能区。另请注意,您可以从模块中添加所需的所有项目,但模块不能从功能区中删除项目,除非它有对它的引用,或者是创建它的那个。

于 2011-08-31T04:59:52.570 回答