c# - 将多个元素添加到 Prism 区域

标签 c# .net prism ribbon-control

我将 Prism 与 Microsoft WPF 功能区一起使用,一切都运行良好,但上下文选项卡有问题。我在我的 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 并将它们注册到该区域...有没有办法只定义一个带有一些 ContextualTabGroup 的用户控件并将它们作为一个整体添加?例如:

<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));

我不知道我是否清楚我要完成的目标,但我将不胜感激任何帮助。

谢谢。

最佳答案

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

这个类有以下结构:

diagram for the clases above

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

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

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

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

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

关于c# - 将多个元素添加到 Prism 区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7231894/

相关文章:

c# - 为什么我的程序从我的 SD 卡运行这么慢?

c# - Newtonsoft.Json 反序列化空字符串

c# - 使用动态创建的控件跟踪值

c# - 使用 WPF 和 PRISM 的模块化 MVVM 应用程序

c# - 由于 'Logger.Logger()' 的保护级别,我无法创建新的 NLog 记录器

c# - 自定义身份验证和 ASP.NET MVC

c# - 如何在 C# 中更改窗体的背景图像?

c# - 使用 EntityFramework 和 .NET Native 时出现 PlatformNotSupportedException

c# - 强制 HttpWebRequest 和 ClientWebSocket 使用 TLS 1.2

c# - 将 ComboBox 的 SelectedValue 分配给 viewmodel wpf 的字符串属性