主窗口前的WPF显示对话框

如何在主窗口之前显示对话窗口(例如login/选项等)?

这是我试过的(显然有一次工作 ,但不是了):

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。 当它closures时,Window1将按预期方式显示。 但是,当我closuresWindow1的应用程序根本不closures。

以下是为我工作的完整解决scheme:

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

好的道歉,这里是解决办法:

我原来的问题几乎工作,只添加一件事,从应用程序XAML中删除StartupUri,然后添加显示到主窗口。

那是:

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

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

如果你把Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 进入对话框的构造函数,并添加

 protected override void OnClosed(EventArgs e) { base.OnClosed(e); Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose; } 

进入对话框类,您不必担心对应用程序的默认行为进行任何更改。 如果您只想将login屏幕捕捉到已经存在的应用程序中,而无需调整启动过程,则此function非常有用。

所以你想显示一个窗口,然后另一个窗口,但closures应用程序时,该窗口closures? 您可能需要将ShutdownMode设置为OnMainWindowClose并将MainWindow设置为Window1,OK行:

 Window1 myMainWindow = new Window1(); Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose; Application.Current.MainWindow = myMainWindow; DialogWindow myDialogWindow = new DialogWindow(); myDialogWindow.ShowDialog(); 

在这里,这样做。 这将有效地改变你的主窗口,并将正常工作,而不必改变你的应用程序对象的设置。

确保删除应用程序启动的事件处理程序,并在您的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(); } }