我有一个使用
C#
+ WPF
制作的应用程序,其中包含两个窗口:
HomeWindow
LoginWindow
在应用程序启动之前,我将调用一个加载
LoginWindow
的对话框,也就是说,如果未填写 UserId 属性(因为它总是没有填写)。
为此,请查看我如何设置
App.xaml
和 App.xaml.cs
:
App.xaml
:
<Application x:Class="LoginComFirebase.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:LoginComFirebase"
StartupUri="View/HomeWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
App.xaml.cs
:
public partial class App : Application
{
public static string UserId = string.Empty;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if (string.IsNullOrEmpty(UserId))
{
LoginWindow loginWindow = new LoginWindow();
bool? result = loginWindow.ShowDialog();
if (result != true)
{
Shutdown();
return;
}
}
HomeWindow homeWindow = new HomeWindow();
homeWindow.Show();
}
}
在我的
LoginWindow
内,我有一个执行以下功能的按钮:
private void LoginButtonClick(object? sender, EventArgs e)
{
App.UserId = "user_ok";
Close();
}
最大的问题是,当我运行应用程序时,对话框窗口 (
LoginWindow
) 消失,但主窗口 (HomeWindow
) 从未加载。
这会导致我的应用程序关闭。就我而言,我希望先显示登录屏幕,然后再向用户显示主屏幕。
解决方案:如果应用程序中没有打开另一个窗口,则无法关闭窗口。
当我的对话框返回布尔值 (
bool? result = loginWindow.ShowDialog();
) 时,该对话框将自动关闭,无论我是否调用 Close()
方法。
但是,仅仅因为窗口已关闭并且我们没有打开另一个窗口,
OnStartup
方法仍然会执行接下来的命令。
但是,从我们尝试打开另一个窗口的那一刻起(
homeWindow.Show();
),这个命令将不起作用,因为如果你没有打开一个窗口(或者如果正在关闭的窗口是唯一的,就像我的那样)情况),这可能会导致没有可见窗口的状态,从而导致应用程序关闭(即使您尝试在几毫秒后打开一个新窗口)。
因此,解决此问题的唯一方法是在返回对话框结果之前打开一个新窗口:
private void LoginButtonClick(object? sender, EventArgs e)
{
App.UserId = "user_ok";
HomeWindow homeWindow = new HomeWindow();
homeWindow.Show();
DialogResult = true;
}
并且不要忘记从
StartupUri
中删除 App.xaml
:
<Application x:Class="LoginComFirebase.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:LoginComFirebase">
<Application.Resources>
</Application.Resources>
</Application>