簡體   English   中英

在棱鏡v4 WPF應用中打開第二個外殼(區域)

[英]Open second shell in prism v4 WPF app (regions)

我有一個棱鏡應用程序,其中包含Shell.xaml(帶有MainRegion),ShellViewModel.cs。

應用程序啟動時將打開此Shell窗口。 現在,我想打開第二個Popup-Window,其中包含完全相同的Shell窗口(Shell.xaml,ShellViewModel)。

Shell定義類似於在棱鏡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>

后面的代碼僅包含基本的ViewModel參考:

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和ViewModel標記為不共享是很容易的:

[PartCreationPolicy(CreationPolicy.NonShared)]

但是我的問題是:

1)我加載其他視圖(模型)到MainRegion。 我如何告訴程序是否應將View(Model)加載到主Shell MainRegion或彈出窗口MainRegion中? 我想我需要范圍內的RegionManager,但是我不知道如何使用它們。

2)我已經將一些事件(EventAggregator)加載到了一個區域中,以向外殼程序傳達通知和命令(狀態更新,視圖關閉,錯誤)以供命令行管理程序報告。 如何將主shell事件與彈出窗口事件分開(因為這兩個都是同一個shell)?

我希望能夠打開幾個彈出窗口,因此對我兩個人使用不同的區域名稱是不夠的,我需要更多的分隔。 也許有一種方法可以創建一個單獨的內部棱鏡/ mef /區域/容器框架?

我不完全理解打開兩個殼意味着什么? 如果您在兩個不同的窗口中運行silverlight應用程序,或者您有2個WPF應用程序實例,那么您的Shell不會沖突。 即使您的一個應用程序具有2個Bootstrapper實例,也不會發生沖突-您的兩個shell完全可以獨立工作。 讓我知道這是否有幫助。

盡管有些事情我對您的方法尚不完全了解,但您正在嘗試實現的目標是可能的。

我假設當您談論擁有兩個Shell時,實際上是指同時擁有兩個活動窗口。

在Prism中有很多方法可以實現此目的,所以讓我們繼續您的疑惑。

對於(1),我能想到的最好的事情是創建Region Manager的另一個實例,並將其附加到另一個Shell(彈出窗口)。 這類似於使用作用域區域(因為您將有一個單獨的RegionManager),但是您創建了管理器並將其附加到Shell。 然后在MEF中使用字符串ID注冊新的RegionManager,以便您可以將其與MainWindow RegionManager區別開,並且只需將區域添加到正確的區域管理器即可。

(2)是一個不同的主題,因為您正在嘗試使相同的代碼具有不同的行為。 也許,如果您需要這種不同的行為,則對兩個窗口使用相同的Shell類並不是最佳方法。 如果您需要這種可區分性,但仍想重用代碼,我建議您使用某種形式的繼承,並將BaseShell中的虛擬方法與模板方法結合起來,以執行每個Shell不同的功能。

我希望這能說明我的觀點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM