Пользовательское всплывающее окно до загрузки окна Prism 7.1 - как?
Я использую 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
}
}
Я поиграл с разными методами, изменил положение вызовов на метод базового класса и т. Д., Но не могу заставить его работать. Кто-нибудь может подсказать, как это можно сделать? Причина этого заключается в том, что я не хочу загружать целые модули в приложение, если мне это не нужно (на основе пользовательского ввода). Спасибо....
0 ответов
Answer Зомби ответь, но лучше поздно, что никогда...
Я не уверен, что это предпочтительный способ сделать что-то, но я делаю то же самое в 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;
}