如何在主窗口之前显示对话窗口(例如登录/选项等)?
这是我尝试过的(显然是has once worked,但现在不是了):
XAML :
<Application ...
Startup="Application_Startup">
应用:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
Window1 myMainWindow = new Window1();
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
}
}
结果:首先显示myDialogWindow。关闭时,Window1将按预期显示。但是当我关闭Window1时,应用程序根本没有关闭。
答案 0 :(得分:71)
以下是适用于我的完整解决方案:
在 App.xaml 中,我删除StartupUri
内容,并添加Startup
处理程序:
<Application x:Class="MyNamespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="ApplicationStart">
</Application>
在 App.xaml.cs 中,我按如下方式定义处理程序:
public partial class App
{
private void ApplicationStart(object sender, StartupEventArgs e)
{
//Disable shutdown when the dialog closes
Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
var dialog = new DialogWindow();
if (dialog.ShowDialog() == true)
{
var mainWindow = new MainWindow(dialog.Data);
//Re-enable normal shutdown mode.
Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Current.MainWindow = mainWindow;
mainWindow.Show();
}
else
{
MessageBox.Show("Unable to load data.", "Error", MessageBoxButton.OK);
Current.Shutdown(-1);
}
}
}
答案 1 :(得分:6)
好的道歉,这是解决方案:
我原来的问题几乎可以解决,只需添加一件事,从Application XAML中删除StartupUri,然后将Show添加到主窗口。
那是:
<Application x:Class="DialogBeforeMainWindow.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_Startup">
以上, StartupUri已删除。
添加 myMainWindow.Show():
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
Window1 myMainWindow = new Window1();
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
myMainWindow.Show();
}
}
答案 2 :(得分:3)
WPF将App.Current.MainWindow
设置为打开的第一个窗口。如果您可以控制辅助窗口构造函数,只需在那里设置App.Current.MainWindow = Null
即可。构建主窗口后,它将按预期分配给App.Current.MainWindow
属性,无需任何干预。
public partial class TraceWindow : Window
{
public TraceWindow()
{
InitializeComponent();
if (App.Current.MainWindow == this)
{
App.Current.MainWindow = null;
}
}
}
如果您没有访问权限,您仍然可以在主窗口的构造函数中设置MainWindow
。
答案 3 :(得分:3)
如果您将Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
放入对话框的构造函数中,并添加
protected override void OnClosed(EventArgs e) {
base.OnClosed(e);
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
}
进入对话框类,您无需担心对应用程序的默认行为进行任何更改。如果您只想将登录屏幕捕捉到已存在的应用程序而不调整启动过程,这非常有用。
答案 4 :(得分:2)
所以你要显示一个窗口,然后显示另一个窗口,但是当该窗口关闭时关闭应用程序?您可能需要将ShutdownMode设置为OnMainWindowClose,并将MainWindow设置为Window1,沿着OK行:
Window1 myMainWindow = new Window1();
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Application.Current.MainWindow = myMainWindow;
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
答案 5 :(得分:0)
在这里,这样做。这将动作更改您的主窗口,并且无需更改应用程序对象的设置即可正常工作。
确保删除应用程序启动的事件处理程序,并在app.xaml文件中设置StartupUri。
public partial class App : Application
{
bool init = false;
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
if (!init)
{
this.MainWindow.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
init = true;
}
}
void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Window toClose = this.MainWindow;
this.MainWindow = new Window2();
this.MainWindow.Show();
}
}