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