2010-12-06 79 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不同的內容。

我希望這可以說明我的觀點。