我有一个棱镜应用程序,包含一个Shell.xaml(与MainRegion),ShellViewModel.cs。在棱镜v4 WPF应用程序(区域)打开第二壳
该应用程序启动时会打开此Shell窗口。现在我想打开另一个包含相同shell窗口(Shell.xaml,ShellViewModel)的弹出窗口。
壳的定义就像在棱镜StockTraderRI示例中。 Shell.xaml包含MainRegion(非常简化的源):
<Window x:Class="Bsoft.Test.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.codeplex.com/CompositeWPF"
Title="MainWindow" Height="550" Width="825">
<Grid>
<ContentControl cal:RegionManager.RegionName="MainRegion"/>
</Grid>
</Window>
代码后面只包含基本视图模型参考:
namespace Bsoft.Test.bmedApp
{
[Export]
public partial class Shell : Window
{
[ImportingConstructor]
public Shell()
{
InitializeComponent();
}
[Import]
ShellViewModel ViewModel
{
set
{
this.DataContext = value;
}
}
}
}
的ShellViewModel自动由MEF装载机插入:
namespace Bsoft.Test.bmedApp
{
[Export]
public class ShellViewModel : NotificationObject
{
[ImportingConstructor]
public ShellViewModel()
{
}
}
}
这确实像预期的那样工作。
现在我想再次打开shell窗口作为弹出窗口。这是很容易,以纪念壳牌和视图模型为未使用共享:
[PartCreationPolicy(CreationPolicy.NonShared)]
但我的问题是:
1)我加载其他视图(型号)到MainRegion。我该如何告诉程序View(Model)应该加载到主Shell MainRegion还是加载到弹出窗口MainRegion中?我想我需要scoped RegionManagers,但我不知道如何使用它们。
2)我已经有一些事件(EventAggregator)加载到一个区域来传递通知和命令(状态更新,视图关闭,错误)以供Shell报告。我怎样才能从弹出的窗口事件中分离出主要的shell事件(因为两者都是相同的shell)?
我想打开几个弹出窗口,所以使用不同的区域名称对我来说是不够的,我需要更多的分离。也许有办法创建一个单独的内部棱镜/ mef/region /容器框架?
我只想知道为什么再次打开一个shell?如果shell是一个需要重用的视图,为什么不把它们概括出来,在它上面创建两个包装。一个是外壳,另一个是可以再次打开多次的视图。 – decyclone 2010-12-23 10:56:29
shell是我的包装器,包含一个带有许多项目的TabControl。我只想让用户能够为相同类型的视图打开第二个包装,以便他可以并排查看它们。 – Sam 2010-12-23 10:59:35
无论如何,我不知道如何实现您的建议:如何为两个或多个视图中的每一个分隔区域和事件。 – Sam 2010-12-23 11:23:51