1

我正在使用 Prism 7.1 WPF 和 Prism Unity。

在主要<prism:PrismApplication/>运行之前,或者当主 Prism 窗口出现时,我希望有一个模式弹出窗口供用户输入一些数据。输入数据将用于用户登录,更重要的是,用于确定将哪些 Prism 模块加载到应用程序中。

我该怎么做呢?我曾尝试在以下PrismApplication重载方法中显示自定义 WPF 窗口,但该窗口没有出现,或者整个应用程序关闭:

public partial class App : PrismApplication
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return base.CreateModuleCatalog();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
    }

    protected override Window CreateShell()
    {
        return ServiceLocator.Current.GetInstance<MainWindow>();
    }

    protected override void OnInitialized()
    {
        base.OnInitialized();
    }

}

例如,如果我在 CreateModuleCatalog() 中调用显示自定义 WPF 窗口,它将显示,但整个应用程序将关闭:

    protected override IModuleCatalog CreateModuleCatalog()
    {
        LoginWindow loginWindow = new LoginWindow();
        if (loginWindow.ShowDialog() == true)
        {
            // OK
        }
        else
        {
            // Cancel
        }

        return base.CreateModuleCatalog();
    }

...如果我把调用放在 OnStartup() 中,它不会显示,直到所有其他覆盖都被执行并显示主 Prism 窗口(处理用户输入为时已晚):

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        LoginWindow loginWindow = new LoginWindow();
        if (loginWindow.ShowDialog() == true)
        {
            // OK
        }
        else
        {
            // Cancel
        }
    }

我玩过不同的方法,改变了对基类方法的调用位置等,但似乎无法让它工作。谁能建议如何做到这一点?这样做的原因是,如果我不需要(基于用户输入),我不想将整个模块加载到应用程序中。谢谢....

4

1 回答 1

2

‍♀️僵尸回答,但最好迟到永远......

我不确定这是做事的首选方式,但我在做同样的事情CreateShell()

    protected override Window CreateShell()
    {
        // Stop things from shutting down when the dialog closes
        Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

        var loginView = Container.Resolve<LoginView>();

        loginView.ShowDialog();

        // ...Do something with the result of the login dialog here...

        var mainWindow = Container.Resolve<MainWindow>();
        mainWindow.Loaded += ( _, __ ) =>
        {
            Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
            mainWindow.Activate();
        };
        return mainWindow;
    }
于 2019-02-05T21:51:15.337 回答