You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用启动时关闭LoginWindow后HomeWindow无法打开的问题

解决WPF登录窗口优先显示后主窗口不加载的问题

问题根源

你的问题出在应用启动流程的控制逻辑上:默认如果App.xaml指定了StartupUri,或者没有手动在代码中触发主窗口的显示,当登录窗口关闭后,WPF应用会因为没有活跃窗口而直接退出。

修复步骤

1. 移除App.xaml中的自动启动配置

打开App.xaml,删除StartupUri="HomeWindow.xaml"这一行,让应用启动时不自动加载主窗口,改为手动控制:

<Application x:Class="YourAppNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:YourAppNamespace">
    <Application.Resources>
         
    </Application.Resources>
</Application>

2. 重写App.xaml.cs的启动逻辑

在App.xaml.cs中重写OnStartup方法,手动处理登录窗口的显示和主窗口的触发:

using System;
using System.Windows;

namespace YourAppNamespace
{
    public partial class App : Application
    {
        public static string UserId { get; set; }

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            // 显示模态登录窗口,阻塞直到窗口关闭
            var loginWindow = new LoginWindow();
            loginWindow.ShowDialog();

            // 登录成功(UserId不为空)则启动主窗口
            if (!string.IsNullOrEmpty(UserId))
            {
                new HomeWindow().Show();
            }
            else
            {
                // 未完成登录,直接退出应用
                Shutdown();
            }
        }
    }
}

3. 确保登录按钮的逻辑正确

在LoginWindow.xaml.cs的登录按钮点击事件中,验证通过后设置App.UserId并关闭窗口:

private void LoginButton_Click(object sender, RoutedEventArgs e)
{
    // 这里替换为你的账号密码验证逻辑
    bool isAuthenticated = ValidateCredentials(UsernameTextBox.Text, PasswordBox.Password);

    if (isAuthenticated)
    {
        App.UserId = UsernameTextBox.Text; // 或实际用户ID
        this.Close();
    }
    else
    {
        MessageBox.Show("登录失败,请检查账号密码");
    }
}

// 示例验证方法
private bool ValidateCredentials(string username, string password)
{
    // 替换为你的实际验证逻辑(比如数据库查询)
    return username == "admin" && password == "123456";
}

关键说明

  • 使用ShowDialog()而非Show()显示登录窗口:ShowDialog()是模态窗口,会阻塞当前线程,直到登录窗口关闭后才会执行后续的主窗口启动逻辑;如果用Show(),应用会继续执行后续代码,可能导致主窗口提前显示或应用直接退出。
  • 登录失败时的处理:如果用户关闭登录窗口或验证失败,UserId仍为空,此时调用Shutdown()直接退出应用,符合预期逻辑。

内容的提问来源于stack exchange,提问作者Sudo Sur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:38:19