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

WinUI3程序启动时仅显示一次登录ContentDialog的实现方法

实现WinUI3启动时仅弹出一次登录ContentDialog

你可以直接在程序入口App.xaml.cs中处理登录弹窗逻辑,这样能保证弹窗仅在启动时触发一次,完全避免页面重复弹出的问题,以下是具体实现步骤:

1. 修改App.xaml.cs的启动逻辑

打开App.xaml.cs,在OnLaunched方法中添加登录弹窗的异步调用,确保程序启动时优先触发登录验证:

using Microsoft.UI.Xaml;
using login_test.Views;
using Microsoft.UI.Xaml.Controls;

namespace login_test;

public partial class App : Application
{
    private Window _mainWindow;

    public App()
    {
        InitializeComponent();
    }

    protected override async void OnLaunched(LaunchActivatedEventArgs args)
    {
        _mainWindow = new MainWindow();
        // 先激活窗口以获取有效XamlRoot,否则弹窗无法显示
        _mainWindow.Activate();

        // 调用登录弹窗,等待验证结果
        bool loginSuccess = await ShowLoginDialog(_mainWindow.Content.XamlRoot);
        
        if (!loginSuccess)
        {
            // 登录失败或取消,直接退出程序
            _mainWindow.Close();
            return;
        }

        // 登录成功,加载主页面(保留Template Studio原有导航逻辑)
        var frame = _mainWindow.Content as Frame;
        if (frame == null)
        {
            frame = new Frame();
            frame.NavigationFailed += OnNavigationFailed;
            _mainWindow.Content = frame;
        }

        if (frame.Content == null)
        {
            frame.Navigate(typeof(page1Page), args.Arguments);
        }
    }

    private async Task<bool> ShowLoginDialog(XamlRoot xamlRoot)
    {
        var loginDialog = new ContentDialog
        {
            XamlRoot = xamlRoot,
            Content = new LoginPage(),
            PrimaryButtonText = "Login",
            CloseButtonText = "Cancel",
            DefaultButton = ContentDialogButton.Primary
        };

        var dialogResult = await loginDialog.ShowAsync();

        if (dialogResult == ContentDialogResult.Primary)
        {
            // 获取登录页输入的账号密码,替换为你的实际验证逻辑
            var loginPage = loginDialog.Content as LoginPage;
            string username = loginPage.usernameTB.Text;
            string password = loginPage.passwordTB.Password;
            
            // 示例:简单验证,非空即视为成功
            return !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password);
        }
        else
        {
            // 取消或关闭弹窗,视为登录失败
            return false;
        }
    }

    private void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
    {
        throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
    }
}

2. 移除Page1中的重复弹窗逻辑

打开page1Page.xaml.cs,删除原有的Loaded事件绑定和弹窗代码,避免页面加载时重复触发:

// 移除以下代码:
// this.Loaded += MainPage_Loaded;

// 同时删除MainPage_Loaded方法

关键说明

  • 单次触发保障:OnLaunched是WinUI程序启动时唯一执行的入口方法,在此处调用弹窗可确保仅触发一次。
  • XamlRoot依赖:必须先激活主窗口才能获取有效的XamlRoot,否则ContentDialog无法正常显示。
  • 灵活的验证逻辑:在ShowLoginDialog方法中,你可以直接对接后端接口或本地验证逻辑,根据实际需求调整登录成功的判断条件。
  • 隐私优化(可选):如果不想让用户看到主窗口直到登录完成,可以在激活窗口后先设置_mainWindow.Visibility = Visibility.Collapsed;,登录成功再改为Visibility.Visible;。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:47:33