加载Prism 7.1窗口之前的用户弹出窗口-怎么样?

时间:2018-11-10 03:56:39

标签: c# wpf prism-7

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

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

我将如何去做?我试图在以下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
        }
    }

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

1 个答案:

答案 0 :(得分:1)

‍♀️ Zombie回答,但最好不要迟到...

我不确定这是做事的首选方式,但是我在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;
    }