2016-11-16 76 views
0

我正在学习不同的棱镜功能,现在我卡在打开新窗口。 我的应用程序Shell具有主区域和明细区域。 壳牌的主区域具有DataGrid,其中的项目在单击时显示其在Detail区域中的属性。 我需要的是一种通过双击主区域中的项目来创建窗口的新实例的方法。 每个新窗口都可以保持活动状态,直到关闭它为止,这样我可以通过单击主区域中的任何其他项目打开其他窗口。棱镜Mvvm Mef交互性打开窗口新实例

在预MVVM棱柱时候,我可能会做这样的事情:

ICollection<Window> MyWindows = new List<Window>(); 
    var wnd = MyWindows.SingleOrDefault(x => x.Name == id.ToString()); 
    if (wnd == null) 
    { 
     wnd = new MyWindow(this, id); 
     MyWindows.Add(wnd); 
    } 
    wnd.Show(); 

但是,这是一个没有去从壳牌的视图模型和棱镜...

曾使用类似InteractionRequestTrigger从我的外壳xaml:

<prism:InteractionRequestTrigger SourceObject="{Binding CyberPopUpViewRequest, Mode=OneWay}"> 
    <prism:PopupWindowAction> 
     <prism:PopupWindowAction.WindowContent> 
      <views:CyberPopUpView /> 
     </prism:PopupWindowAction.WindowContent> 
    </prism:PopupWindowAction> 
</prism:InteractionRequestTrigger> 

但是,这使我只能创建单个窗口。

回答

3

但是,这是由壳牌视图模型和棱镜不走......

真,如果你在视图模型直接把代码。它的服务(这是注入的依赖,测试时可以用模拟来替代):但是,如果你把(隐藏已读):这是完全没问题

internal class WindowManager : IWindowManager 
{ 
    public void CreateWindow(string id) 
    { 
     Window wnd; 
     if (!_myWindows.TryGetValue(id, out wnd)) 
     { 
      wnd = new MyWindow(Application.Current.MainWindow, id); 
      _myWindows[ id ] = wnd; 
     } 
     wnd.Show(); 
    } 

    private Dictionary<string, Window> _myWindows = new Dictionary<string, Window>(); 
} 
+0

感谢,将检查了这一点,因为我没想到的将窗口创建投入使用。是否有可能在新窗口的新布局中定义新的棱镜区域? – VladacusB

+0

我从来没有尝试过,但它可能工作,我想。 – Haukinger