应用程序启动时关闭 LoginWindow 后 HomeWindow 无法打开

问题描述 投票:0回答:1

我有一个使用

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
) 从未加载。

这会导致我的应用程序关闭。就我而言,我希望先显示登录屏幕,然后再向用户显示主屏幕。

c# .net wpf
1个回答
0
投票

解决方案:如果应用程序中没有打开另一个窗口,则无法关闭窗口。

当我的对话框返回布尔值 (

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>
© www.soinside.com 2019 - 2024. All rights reserved.