代码之家  ›  专栏  ›  技术社区  ›  crackanddie

如何使用Prism UnityContainer制作预览窗口?

  •  0
  • crackanddie  · 技术社区  · 1 年前

    我对Prism容器很陌生,想在WPF中创建一个带有预览窗口的应用程序。我该怎么做才能以正确的方式完成它?这个是我做的 CreateShell 方法(继承自PrismaApplication):

    protected override Window CreateShell()
    {
        var previewWindow = Container.Resolve<IPreviewWindow>();
        previewWindow.PreviewDone += (e, a) =>
        {
            (previewWindow as Window).Close();
            var window = Container.Resolve<IBaseWindow>() as Window;
            window.Show();
        };
        return previewWindow as Window;
    }
    

    这个 IPreview窗口 :

    public interface IPreviewWindow : IBaseWindow
    {
        event EventHandler<EventArgs> PreviewDone;
    }
    

    这样做可以吗?

    1 回复  |  直到 1 年前
        1
  •  2
  •   samgi    1 年前

    您为之编写的代码 CreateShell 方法和 IPreviewWindow 界面似乎适用于大多数场景,它注册了 PreviewDone 事件 IPreview窗口 ,并且当触发此事件时,它将关闭预览窗口并打开主窗口( IBaseWindow )。

    然而,为了更好的实践和可维护性,我建议以下几点:

    1. 松散耦合事件: Prism提供 EventAggregator 对于事件处理,这可能是处理组件之间通信的更好方式,而不是直接订阅事件。您可以创建 PreviewDoneEvent 从继承的类 PubSubEvent 并使用 事件聚合器 订阅/发布此事件。这有助于使组件更加解耦。

    2. 导航: 您可能需要考虑使用Prism的导航系统,而不是手动创建并关闭窗口。有了这一点,您可以导航到不同的视图,而不必关心它们应该在哪个窗口中,这使您的应用程序更易于维护。

    3. 单一责任原则: 这个 CreateShell 方法的主要职责应该只是创建shell,它可能不是处理导航或切换窗口的最佳位置。为此,您可能需要创建一个单独的服务或使用Prism的内置功能,如上所述。

    4. 螺纹安全: 请记住,在WPF中,对UI元素的任何操作都应该在UI线程上,因此请确保 预览完成 在UI线程上调用事件。

    下面是一个如何重写 CreateShell 方法使用 事件聚合器 和Prism的导航:

    protected override Window CreateShell()
    {
        Container.Resolve<IEventAggregator>().GetEvent<PreviewDoneEvent>().Subscribe(OnPreviewDone);
        return Container.Resolve<IPreviewWindow>() as Window;
    }
    
    private void OnPreviewDone()
    {
        Application.Current.Dispatcher.Invoke(() =>
        {
            var window = Container.Resolve<IBaseWindow>() as Window;
            window.Show();
        });
    }
    

    本例假设您有 PreviewDoneEvent 继承自 PubSubEvent 并且在预览完成时发布。

    记住,这只是一个基本的例子。根据您的需求和应用程序的复杂性,您可能需要相应地调整代码。