Prism: отображение диалогового окна через два модуля - PullRequest
3 голосов
/ 18 января 2012

У меня есть два модуля Prism. Я хочу, чтобы один из них зарегистрировал окно, а другой показал это окно в режиме «Показать диалог». Как это можно сделать (если это возможно)?

Ответы [ 2 ]

1 голос
/ 18 января 2012

Хорошо.Я думаю, что решил это, следуя этому совету .Но я не знаю, было ли это лучшим решением.

Я только что создал окно в своем проекте 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>

Popup.xaml.cs:

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;
    }
}

И, наконец, когда я хочу показать диалоговое окно (в команде, которая находится в модуле), я просто создаю его экземпляр и сообщаю, что такое 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();
}
1 голос
/ 18 января 2012

Да, это можно сделать. Это грубая процедура:

Объявите интерфейс для этого представления в вашем проекте "Инфраструктура"

public interface IMyDialogWindow
{
}

Класс [Export], который реализует этот интерфейс в вашем модуле

[Export(typeof(IMyDialogWindow))]
public class MyClassInModuleA : IMyDialogWindow
{
}

[Import] этот класс в другом модуле и использовать его для диалога

[Import]
public IMyDialogWindow PropertyInModuleB
...