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