有没有人知道使用Prism的WPF代码示例,其中每个模块在另一个模块的菜单中将自己注册为menuitem?
(我目前有一个应用程序尝试使用EventAggregator执行此操作,因此一个模块侦听来自其他模块的已发布事件,这些模块需要在菜单中将其标题作为菜单项,但我遇到了订单问题加载和线程等我想找到一个使用经典Prism结构来做这个的例子.)
我在考虑这个问题:
Shell.xaml:
<DockPanel>
<TextBlock Text="Menu:" DockPanel.Dock="Top"/>
<Menu
Name="MenuRegion"
cal:RegionManager.RegionName="MenuRegion"
DockPanel.Dock="Top"/>
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
合同视图:
<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>
Run Code Online (Sandbox Code Playgroud)
客户观点:
<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>
Run Code Online (Sandbox Code Playgroud)
但是要知道我已经完成了非Prism MVVM应用程序结构,并且Menus总是很好地绑定到ViewModel中的ObservableCollections,上面似乎打破了这个漂亮的模式.以上是在Prism中做到这一点的习惯方式吗?
[编辑#3] - 阅读此问题的任何人:在任何情况下都不要使用此问题中概述的方法. 这是一个编码恐怖片.我很自然地承认这一点,因为我知道所有的程序员都曾在过去的一个角落里工作过(尤其是在学习新技术的时候),我们都被其他善意的开发人员误入歧途.首先阅读罗伯特的答案,然后阅读这个问题.请.
[编辑#2b]
我为这个问题的长度道歉 - 这里有一个问题(最后!),但我想确保源代码是明确的.无论如何.
[编辑#2] - 问题标题更改为更准确地反映...问题.
[编辑] - 我已经更新了一些关于我如何最终得到我在这里做的设计/代码的历史:强制性博客文章.如果它有助于澄清下面的问题,请随时阅读它...
原始问题
我正在使用的应用程序使用Prism和WPF,其中包含许多模块(目前为3个),其中一个模块承载应用程序菜单.最初,菜单是静态的,并且挂钩到CompositeCommand/DelegateCommands,这非常适合将按钮按下到适当的演示者.每个MenuItem在其标题中使用StackPanel将内容显示为图像和文本标签的组合 - 这就是我想要的样子:
<Menu Height="48" Margin="5,0,5,0" Name="MainMenu" VerticalAlignment="Top" Background="Transparent">
<MenuItem Name="MenuFile" AutomationProperties.AutomationId="File">
<MenuItem.Header>
<StackPanel>
<Image Height="24" VerticalAlignment="Center" Source="../Resources/066.png"/>
<ContentPresenter Content="Main"/>
</StackPanel>
</MenuItem.Header>
<MenuItem AutomationProperties.AutomationId="FileExit" Command="{x:Static local:ToolBarCommands.FileExit}">
<MenuItem.Header>
<StackPanel>
<Image Height="24" VerticalAlignment="Center" Source="../Resources/002.png"/>
<ContentPresenter Content="Exit"/>
</StackPanel>
</MenuItem.Header>
</MenuItem>
</MenuItem>
<MenuItem Name="MenuHelp" AutomationProperties.AutomationId="Help" Command="{x:Static local:ToolBarCommands.Help}">
<MenuItem.Header>
<StackPanel>
<Image Height="24" VerticalAlignment="Center" Source="../Resources/152.png"/>
<ContentPresenter Content="Help"/>
</StackPanel>
</MenuItem.Header>
</MenuItem>
</Menu>
Run Code Online (Sandbox Code Playgroud)
不幸的是,应用程序变得有点复杂,并且希望其他模块在菜单中注册自己 - 因此,我一直在考虑使菜单动态化.目标是让其他模块(通过服务)能够随意向菜单添加命令 - 例如,模块A将在工具栏模块中添加一个菜单项,该模块调用模块A中的处理程序.有一些优秀的文章关于这个主题 …