WPF在主窗口之前显示对话框

时间:2009-10-08 19:35:21

标签: wpf dialog

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

这是我尝试过的(显然是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时,应用程序根本没有关闭。

6 个答案:

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