2010-12-06 80 views
4

我有一个棱镜应用程序,包含一个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 /容器框架?

+0

我只想知道为什么再次打开一个shell?如果shell是一个需要重用的视图,为什么不把它们概括出来,在它上面创建两个包装。一个是外壳,另一个是可以再次打开多次的视图。 – decyclone 2010-12-23 10:56:29

+0

shell是我的包装器,包含一个带有许多项目的TabControl。我只想让用户能够为相同类型的视图打开第二个包装,以便他可以并排查看它们。 – Sam 2010-12-23 10:59:35

+0

无论如何,我不知道如何实现您的建议:如何为两个或多个视图中的每一个分隔区域和事件。 – Sam 2010-12-23 11:23:51

回答

1

我不完全明白你打开两个shell是什么意思? 如果您在两个不同的窗口中运行Silverlight应用程序,或者您有两个WPF应用程序实例,那么您的Shell不会发生冲突。 即使你有一个带有2个Bootstrapper实例的应用程序,也没有冲突 - 你的两个shell完全独立工作。 让我知道这是否有帮助。

1

尽管可能有些事情我并不完全了解你的方法,但你试图实现的是可能的。

我认为当你谈论拥有两个Shells时,你实际上是指同时有两个活动窗口。

在棱镜中有many ways,所以让我们继续讨论你的疑惑。

对于(1)我能想到的最好的事情是创建区域管理器的另一个实例,并将其连接到其他Shell(弹出窗口)。这与使用作用域区域类似(因为您将拥有单独的RegionManager),但您创建管理器并将其附加到Shell。然后使用字符串ID在MEF中注册新的RegionManager,以便您可以将其与MainWindow RegionManager区分开来,并将区域添加到正确的区域管理器中。

(2)是一个不同的主题,因为您试图让相同的代码行为有所不同。也许,如果你需要这种不同的行为,那么对这两个窗口使用相同的Shell类并不是最好的方法。如果您需要这种可区分性,但仍希望重用代码,我建议使用某种形式的继承,并将BaseShell中的虚拟方法与模板方法结合使用,以执行每个Shell不同的内容。

我希望这可以说明我的观点。