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

WinUI3中如何正确关闭登录窗口并打开编辑器窗口?

WinUI3 登录成功后切换窗口的正确实现

你的问题出在错误创建了新的登录窗口实例来执行关闭操作,而非操作当前正在显示的登录窗口,这才导致了内存访问错误。以下是正确的实现步骤:

1. 配置应用不随主窗口关闭而退出

打开App.xaml.cs,修改OnLaunched方法,添加代码让应用在主窗口(登录窗口)关闭时不立即退出:

protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
    m_window = new MainWindow(); // MainWindow即你的登录窗口
    m_window.Activate();
    
    // 关闭主窗口时不自动终止应用
    Microsoft.UI.Windowing.AppInstance.GetCurrent().ExitWhenMainWindowClosed = false;
}

2. 登录验证成功后切换窗口

在登录窗口(MainWindow)的登录逻辑代码中,验证账号密码正确后,直接打开编辑器窗口并关闭当前登录窗口:

// 假设这是登录按钮的点击事件处理方法
private void LoginButton_Click(object sender, RoutedEventArgs e)
{
    // 先执行账号密码验证逻辑,验证通过后执行以下代码
    if (IsCredentialsValid())
    {
        // 打开编辑器窗口
        var editorWindow = new EditorWindow();
        editorWindow.Activate();
        
        // 关闭当前的登录窗口(直接用this,不要新建实例)
        this.Close();
    }
}

3. 确保编辑器窗口关闭时退出应用

为了避免编辑器窗口关闭后应用仍在后台运行,在EditorWindow.xaml.cs中添加窗口关闭事件处理:

public EditorWindow()
{
    this.InitializeComponent();
    this.Closed += EditorWindow_Closed;
}

private void EditorWindow_Closed(object sender, WindowEventArgs e)
{
    // 编辑器窗口关闭时,退出整个应用
    Microsoft.UI.Xaml.Application.Current.Exit();
}

错误原因说明

你之前的代码中,var oldWindow = new MainWindow(); oldWindow.Close();创建的是一个全新的、从未激活显示的窗口实例,并非当前用户正在操作的登录窗口。对未初始化完成的窗口执行关闭操作,会触发系统的内存保护机制,导致你遇到的错误。直接使用this.Close()才能正确关闭当前的登录窗口实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:25:17