Подтвердить что ты не робот

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

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

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

XAML

<Application ...
    Startup="Application_Startup">

Application

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

}

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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