代码之家  ›  专栏  ›  技术社区  ›  Ciantic

WPF在主窗口前显示对话框

  •  38
  • Ciantic  · 技术社区  · 17 年前

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

    这是我试过的(很明显) has once worked ,但现在不是了):

    :

    <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首先显示。当窗口关闭时,窗口1按预期显示。但当我关闭Window1时,应用程序根本没有关闭。

    6 回复  |  直到 15 年前
        1
  •  80
  •   Chris Schiffhauer aleha_84    12 年前

    以下是对我有效的完整解决方案:

    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>
    

    在里面

    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);
            }
        }
    }
    
        2
  •  6
  •   Ciantic    17 年前

    好吧,抱歉,这是解决方案:

    我最初的问题几乎奏效了,只需要添加一件事,从应用程序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">
    

    在上面

    添加 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();
        }
    
    }
    
        3
  •  5
  •   James Durda    14 年前

    WPF集 App.Current.MainWindow 到第一个打开的窗口。如果您可以控制辅助窗口构造函数,只需设置 App.Current.MainWindow = Null 那里构建主窗口后,它将被指定给

    public partial class TraceWindow : Window
    {
        public TraceWindow()
        {
            InitializeComponent();
            if (App.Current.MainWindow == this)
            {
                App.Current.MainWindow = null;
            }
        }
    }
    

    MainWindow 在主窗口的构造函数中。

        4
  •  4
  •   Patrick    13 年前

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

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

        5
  •  2
  •   Steven Robbins    17 年前

    所以你想先显示一个窗口,然后再显示另一个窗口,但在该窗口关闭时关闭应用程序?您可能需要设置 ShutdownMode MainWindow 到Window1,沿以下行确定:

    Window1 myMainWindow = new Window1();
    Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
    Application.Current.MainWindow = myMainWindow;
    DialogWindow myDialogWindow = new DialogWindow();
    myDialogWindow.ShowDialog();
    
        6
  •  0
  •   Muad'Dib    17 年前

    来,像这样做。这将实际更改主窗口并正常工作,而不必更改应用程序对象的设置。

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