向 Prism 区域添加多个元素

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>

通过这种方式,我可以在我的模块中引用那些上下文选项卡组,效果非常好。但是我希望在模块中定义上下文选项卡组。我考虑定义一个区域:

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

然后在我的模块中,每个用户控件都会继承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));

我不知道我是否清楚地表达了我想要实现的目标,但我很感激任何帮助。

谢谢。

1个回答

2

不久前我遇到了同样的问题(但我使用的是Telerik的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; }
}

这个类的结构如下:

diagram for the clases above

关键在于PrioritySet类,它简单地表示一个集合,其中每个项都有一个关联的优先级。
如果像这样注册了此服务到您的框架中,则可以从模块中添加选项卡。请记住,您的Shell项目需要获取RibbonService,然后将项集合绑定到Tabs属性 - 请注意,PrioritySet实现了INotifyCollectionChanged,因此如果绑定了选项卡,其项将自动更新。
此外,您还可以通过此功能获得一些有趣的内容,例如从服务中组合选项卡。例如,一个模块可能只需要向功能区添加一个按钮,这可以通过以下方式轻松完成:
_ribbonService.Tabs.Add(new RibbonButton(){Header = "Button", Icon = new Uri("icon.png")})

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

太棒了。很好的方法。我为了满足自己的需求,对其进行了简化,但效果非常好。谢谢。 - Carles Company

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接