gpt4 book ai didi

c# - 可插入 .NET 4.5 功能区

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

我正在寻找一种方法来提供一种可插入的方式来将项目添加到 .NET 4.5 功能区,并且在这方面取得了一些进展,但并不完全是我想要的方式:

[InheritedExport]
public interface IRibbonItem
{
void Compose(DesignerRibbon ribbon);
}

public class TestItem : IRibbonItem
{
public void Compose(CustomRibbon ribbon)
{
ribbon.ApplicationMenu.Items.Add((new RibbonApplicationMenuItem() { Header = "_Hello, World!" }));
}
}

public class MEFRibbon : System.Windows.Controls.Ribbon.Ribbon
{
[ImportMany]
private IEnumerable<IRibbonItem> _oRibbons = null;

public MEFRibbon() : base()
{
this.ApplicationMenu = new RibbonApplicationMenu();
MEFHelper.Instance.ComposeParts(this);
this._oRibbons.ToList().ForEach(x => x.Compose(this));
}
}

虽然这行得通,但看起来很乱。我更喜欢用 XAML 编写所有插件的内容。有什么方法可以实现这个目标吗?

我看过的所有内容都引用了旧的 Ribbon 或其他一些库。

谢谢。

最佳答案

到目前为止,我遇到了同样的问题。我计划实现的目标:

  • 应用程序应该可以通过插件进行扩展。
  • 应用程序插件应该能够将自己的 UI 内容添加到预定义的 UI 区域:功能区选项卡、功能区应用程序菜单、功能区快速访问工具栏和状态栏。
  • 应尽可能在 MVVM 架构内构建应用程序。
  • 插件开发人员应该能够使用 XAML 描述 UI 内容。不应该有任何 View 模型类型,它会重现功能区控件的层次结构(例如 RibbonTabViewModelRibbonButtonViewModel 等),因为这会导致类的平行层次结构,并且限制了 XAML 的能力。
  • 插件应使用 MEF 加载到主机应用程序中。

这是我使用的方法。
我所有的插件都装饰有 [ApplicationExtension(...)] 并实现 IApplicationExtension:

public interface IApplicationExtension
{
void Startup();
bool CanShutdown();
void Shutdown();
}

ApplicationExtension 声明为:

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class ApplicationExtensionAttribute : ExportAttribute, IApplicationExtensionMetadata
{
public ApplicationExtensionAttribute(/* ... */)
: base(typeof(IApplicationExtension))
{
this.Name = name;
this.UICompositionOrder = uiCompositionOrder;
}

// ...
}

IApplicationExtensionMetadata - 一些元数据,例如显示名称等

宿主应用程序依次实现这个接口(interface):

public interface IApplicationInfrastructureProvider : IInfrastructureProvider
{
ICollection<ViewModel> RibbonTabs { get; }
ICollection<ViewModel> ApplicationMenuItems { get; }
ICollection<ViewModel> QuickAccessToolbarItems { get; }
ICollection<ViewModel> StatusBarItems { get; }
}

其中 ViewModel - 一些基本 View 模型类,并通过 MEF 加载插件:

    [ImportMany]
private IEnumerable<Lazy<IApplicationExtension, IApplicationExtensionMetadata>> Extensions { get; set; }

当应用程序初始化时,它会为每个插件调用Startup 方法。
这里的插件实现能够通过 IApplicationInfrastructureProvider 添加选项卡、菜单项等作为 View 模型以扩展应用程序的 UI。

请注意,这些 View 模型不是任何RibbontTabViewModelRibbonButtonViewModel。它们只是一些功能。

它如何在 UI 端工作。
例如,当 RibbonTabs 集合发生变化时,应用程序调用自定义服务来执行此工作:

  • 首先,它为 View 模型查找资源字典。为简单起见,我使用命名约定:如果选项卡 View 模型的类型是 MyCustomVm,该服务会在同一程序集中查找 MyCustom.xaml
  • 其次,该服务探索资源字典并查找其键以_RibbonTabKey 结尾的资源。 View 模型成为找到的资源的数据上下文。这假定该资源至少是 FrameworkElement
  • 第三,将找到的资源添加到宿主应用程序的 RibbonTabsUI 集合中。

功能区绑定(bind)到主机应用程序 XAML 中的 RibbonTabsUI:

<r:Ribbon x:Name="ribbon" Grid.Row="0" ItemsSource="{Binding RibbonTabsUI}">
<!-- other content -->
</r:Ribbon>

功能区选项卡的示例如下所示:

<r:RibbonTab x:Key="MyCustom_RibbonTabKey" x:Shared="False">
<r:RibbonGroup Header="Some group">
<!-- other content -->
</r:RibbonGroup>
<!-- other content -->
</r:RibbonTab>

ApplicationMenuItemsQuickAccessToolbarItems 的处理方式相同,区别在于资源键后缀。

关于c# - 可插入 .NET 4.5 功能区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23076248/

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