Wpf Prism:通过两个模块显示对话框窗口

Wpf Prism:通过两个模块显示对话框窗口,wpf,module,window,prism,Wpf,Module,Window,Prism,我有两个棱镜模块。 我希望其中一个注册一个窗口,另一个使用“显示对话框”模式显示此窗口。 怎样才能做到(如果可以做到)?是的,可以做到。这是一个粗略的过程: 在“基础结构”项目中声明此视图的接口 在模块中实现此接口的[Export]类 [Export(typeof(IMyDialogWindow))] public class MyClassInModuleA : IMyDialogWindow { } [导入]在其他模块中导入该类,并将其用于对话框 [Import] public IMyDi

我有两个棱镜模块。 我希望其中一个注册一个窗口,另一个使用“显示对话框”模式显示此窗口。
怎样才能做到(如果可以做到)?

是的,可以做到。这是一个粗略的过程:

在“基础结构”项目中声明此视图的接口

在模块中实现此接口的[Export]类

[Export(typeof(IMyDialogWindow))]
public class MyClassInModuleA : IMyDialogWindow
{
}
[导入]在其他模块中导入该类,并将其用于对话框

[Import]
public IMyDialogWindow PropertyInModuleB

嗯。我想我通过以下方法解决了这个问题。但我不知道这是否是最好的解决方案

我刚刚在我的Shell项目上创建了一个窗口。此窗口将作为对话框窗口弹出

代码如下:

Popup.xaml:

<Window x:Class="TryERP2.Shell.Views.Popup"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Popup" Height="315" Width="411"
        xmlns:prism="http://www.codeplex.com/prism">
    <Grid>
        <ContentControl x:Name="DialogRegion" Grid.Row="1" prism:RegionManager.RegionName="DialogRegion" />
    </Grid>
</Window>
最后,当我想显示对话框(在模块中的命令中)时,我只是实例化它并通知RegionManager:

private void showDialog()
{
    // Acquiring the RegionManager
    var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();

    // Getting the Popup object
    Popup p = Popup.getPopup(regionManager);

    // Looking for the view I want to show in the dialog
    var x = new Uri("MyView", UriKind.Relative);

    // Changing the view of the DialogRegion (which is within the Popup)
    regionManager.RequestNavigate("DialogRegion", x);

    // Showing the dialog
    p.ShowDialog();
}
private void showDialog()
{
//获取区域管理器
var regionManager=ServiceLocator.Current.GetInstance();
//获取弹出对象
Popup p=Popup.getPopup(regionManager);
//正在查找要在对话框中显示的视图
var x=新Uri(“MyView”,UriKind.Relative);
//更改对话框区域(在弹出窗口中)的视图
RequestNavigate(“DialogRegion”,x);
//显示对话框
p、 ShowDialog();
}

您可以发布一些示例代码吗?我不能完全理解你的答案。我必须复制其他项目中的文件?我的想法是,在第一个模块的IoC容器中注册视图,然后在第二个模块上“读取”并显示。您必须通过可放置在“基础设施”模块中的接口“粘合”模块a和模块B。这样,ModuleB就可以在不知道的情况下从ModuleA导入您的窗口。。
public partial class Popup : Window
{
    private static Popup popup;

    private Popup(IRegionManager regionManager)
    {
        InitializeComponent();
        RegionManager.SetRegionManager(this, regionManager);
    }

    //Using the singleton pattern
    public static Popup getPopup(IRegionManager regionManager)
    {
        if (popup == null)
            popup = new Popup(regionManager);
        return popup;
    }
}
private void showDialog()
{
    // Acquiring the RegionManager
    var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();

    // Getting the Popup object
    Popup p = Popup.getPopup(regionManager);

    // Looking for the view I want to show in the dialog
    var x = new Uri("MyView", UriKind.Relative);

    // Changing the view of the DialogRegion (which is within the Popup)
    regionManager.RequestNavigate("DialogRegion", x);

    // Showing the dialog
    p.ShowDialog();
}