Пользовательское всплывающее окно до загрузки Prism 7.1 - как? - PullRequest
0 голосов
/ 10 ноября 2018

Я использую Prism 7.1 WPF и Prism Unity.

Перед запуском основного <prism:PrismApplication/> или когда появляется главное окно Prism, я хочу иметь модальное всплывающее окно для ввода пользователем некоторых данных. Входные данные будут для входа пользователя в систему и, что более важно, для определения, какие модули Prism загружать в приложение.

Как бы я поступил так? Я попытался отобразить пользовательское окно WPF в следующих PrismApplication методах перегрузки, но либо окно не появляется, либо закрывается все приложение:

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

}

Например, если я вызову отображение пользовательского окна WPF в CreateModuleCatalog (), оно отобразится, однако все приложение закроется:

    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 голосов
/ 06 февраля 2019

answer Зомби ответ, но лучше поздно, что никогда ... 100

Я не уверен, что это предпочтительный способ сделать что-то, но я делаю то же самое в 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...