WPF показывает диалог перед главным окном - PullRequest
38 голосов
/ 08 октября 2009

Как можно отобразить диалоговое окно (например, логин / настройки и т. Д.) Перед главным окном?

Вот что я попробовал (по-видимому, когда-то работал , но больше нет):

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 ]

71 голосов
/ 21 февраля 2012

Вот полное решение, которое сработало для меня:

В 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);
        }
    }
}
6 голосов
/ 09 октября 2009

Хорошо, извиняюсь, вот решение:

Мой первоначальный вопрос сработал почти одно, добавить только одно, удалить StartupUri из XAML приложения и после этого добавить Show to main window.

То есть:

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

}
3 голосов
/ 05 января 2013

Если вы положите Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; в конструктор диалога и добавите

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

в диалоговом классе, вам не нужно беспокоиться о внесении каких-либо изменений в поведение приложения по умолчанию. Это прекрасно работает, если вы хотите просто привязать экран входа в уже существующее приложение без настройки процедур запуска.

3 голосов
/ 13 июня 2012

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 в конструкторе главного окна.

2 голосов
/ 08 октября 2009

То есть вы хотите показать одно окно, затем другое, но закрыть приложение, когда это окно закрыто? Возможно, вам придется установить ShutdownMode в OnMainWindowClose и установить MainWindow в Window1, вдоль линий ok:

Window1 myMainWindow = new Window1();
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Application.Current.MainWindow = myMainWindow;
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
0 голосов
/ 09 октября 2009

здесь, сделайте это так. это фактически изменит ваше главное окно и будет работать должным образом без необходимости изменять настройки объекта приложения.

обязательно удалите обработчик событий для запуска приложения и установите StartupUri в файле app.xaml.

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();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...