寻找将自身加载到菜单中的模块的 Prism 示例 [英] Looking for Prism example of Modules loading themselves into a menu

查看:18
本文介绍了寻找将自身加载到菜单中的模块的 Prism 示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有谁知道使用 Prism 的 WPF 代码示例,其中每个模块都将自己注册为另一个模块内的菜单中的菜单项?

(我目前有一个应用程序尝试使用 EventAggregator 执行此操作,因此一个模块侦听来自其他模块的已发布事件,这些模块需要在菜单中将其标题作为菜单项,但我遇到了问题加载和线程等​​的顺序.我想找到一个使用经典棱镜结构的例子.)

(I've currently got an application which tries to do this with the EventAggregator, so one module listens for published events from other modules which need to have their title in the menu as a menu item, but I'm getting problems with the order of loading and threading etc. I want to find an example that uses classic Prism structure to do this.)

我是这么想的:

Shell.xaml:

<DockPanel>
    <TextBlock Text="Menu:" DockPanel.Dock="Top"/>
    <Menu 
        Name="MenuRegion" 
        cal:RegionManager.RegionName="MenuRegion" 
        DockPanel.Dock="Top"/>
</DockPanel>

合同视图:

<UserControl x:Class="ContractModule.Views.AllContracts"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="Contracts">
    </MenuItem>
</UserControl>

客户视图:

<UserControl x:Class="CustomerModule.Views.CustomerView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="Customers">
    </MenuItem>
</UserControl>

但据我所知,我已经完成了非 Prism MVVM 应用程序结构,并且菜单总是很好地绑定到 ViewModel 中的 ObservableCollections,上面似乎打破了这个很好的模式.以上是Prism中的惯用方式吗?

But up to know I've done non-Prism MVVM application structure and Menus were always nicely bound to ObservableCollections in the ViewModel and the above seems to break this nice pattern. Is the above the customary way to do it in Prism?

推荐答案

更新:

我为您创建了一个示例.它在这里:示例 (现在是死链接)

I created a sample for you. It's here: Sample (now dead link)

它有一些你可能还没有想到的东西,比如一个允许你的模块控制你的 shell 的合约(这样你就可以做诸如打开窗口之类的事情).它的设计考虑到了 MVVM.我不知道你是否正在使用它,但我会考虑它.

It's got a few things you have probably not thought of yet, like a contract that will allow your modules to control your shell (so you can do stuff like Open Window, that kind of thing). It is designed with MVVM in mind. I don't know if you are using that, but I would consider it.

我尝试了几分钟来让标签标题正确,但最终还是选择了A Tab".如果您使用选项卡式 UI,则将其作为练习留给您.我将其设计为无外观,因此您可以在不破坏任何内容的情况下替换 Shell.xaml 中的 XAML.如果使用得当,这就是 RegionManager 的优势之一.

I tried for a few minutes to get the tab titles correct, but I ended up leaving off with "A Tab". It's left as an exercise for you if you go with a tabbed UI. I've designed it to be lookless, so you can replace the XAML in the Shell.xaml without breaking anything. That's one of the advantages to the RegionManager stuff if you use it right.

无论如何,祝你好运!

我从未见过这样的例子,但你必须自己实现.

I've never seen an example of this, but you'd have to implement this yourself.

您必须创建自己的界面,如下所示:

You'd have to create your own interface, something like this:

public interface IMenuRegistry
{
     void RegisterViewWithMenu(string MenuItemTitle, System.Type viewType);
}

然后,您的模块将声明对 IMenuRegistry 的依赖并注册它们的视图.

Your Modules then would declare a dependency on an IMenuRegistry and register their views.

您对 IMenuRegistry 的实现(您可能会在托管 Bootstrapper 的同一个项目中实现和注册它)您会将这些菜单项添加到您的菜单或树形视图或您用于菜单的任何内容中.

Your implementation of IMenuRegistry (which you would likely implement and register in the same project that hosts your Bootstrapper) you would add those menu items to your menu or treeview or whatever you are using for your menu.

当用户点击一个项目时,您必须使用 Bootstrapper.Container.Resolve(viewType) 方法来创建视图实例并将其填充到您想要显示的任何占位符中在.

When a user clicks on an item you will have to use your Bootstrapper.Container.Resolve(viewType) method to create an instance of the view and stuff it in whatever placeholder you want to show it in.

这篇关于寻找将自身加载到菜单中的模块的 Prism 示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆