WPF показывает диалог перед главным окном

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

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

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, приложение вообще не закрывается.

7 ответов

Решение

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

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

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

Мой первоначальный вопрос сработал почти одно, добавить только одну вещь, удалить 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();
    }

}

Наборы 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;
}

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

Итак, вы хотите показать одно окно, затем другое, но закрыть приложение, когда это окно закрыто? Вам может потребоваться установить для параметра ShutdownMode значение OnMainWindowClose и установить значение MainWindow в Window1, как показано на следующем рисунке:

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

У меня такая же проблема, когда мне нужно убрать экран входа в систему перед моим главным окном.

  1. В вашем главном окне cunstructor добавьте эти строки

                 Application.Current.MainWindow = this;
    
         Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
    
  2. Разрешите главное окно или просто позвоните var mainWindow = new MainWindow()

  3. Вызовите loginScreen.Show() или loginScreen.ShowDialog().

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

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