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

WinUI3非打包应用自定义Content Dialog:将Cancel设为链接

实现自定义底部链接按钮的Content Dialog方案

由于WinUI3的ContentDialog默认按钮不支持直接改为链接样式,核心思路是完全自定义ContentDialog的内容区域,替换默认按钮栏为包含普通按钮和超链接按钮的自定义布局,同时手动处理弹窗关闭逻辑与按钮点击事件。

具体实现步骤

1. 在XAML中定义自定义ContentDialog

直接在StartupWindow.xaml里声明弹窗,将内容区域替换为包含提示文本和自定义按钮栏的布局:

<ContentDialog x:Name="AuthCancelDialog"
               Title="验证未完成"
               CloseButtonVisibility="Collapsed"
               PrimaryButtonVisibility="Collapsed"
               SecondaryButtonVisibility="Collapsed">
    <StackPanel>
        <TextBlock Margin="0,0,0,20">你关闭了验证浏览器窗口,请选择操作:</TextBlock>
        <!-- 自定义底部按钮栏 -->
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Spacing="16">
            <Button x:Name="RetryBtn" Content="重试" Style="{StaticResource AccentButtonStyle}" Click="RetryBtn_Click"/>
            <HyperlinkButton x:Name="CancelLink" Content="取消" Click="CancelLink_Click"/>
        </StackPanel>
    </StackPanel>
</ContentDialog>

2. 代码后台处理点击逻辑

在StartupWindow.xaml.cs中实现按钮与链接的点击事件,完成重启验证、关闭应用的逻辑:

private async void RetryBtn_Click(object sender, RoutedEventArgs e)
{
    AuthCancelDialog.Hide();
    // 调用你的Azure凭据验证启动逻辑
    await StartAzureAuthFlowAsync();
}

private void CancelLink_Click(object sender, RoutedEventArgs e)
{
    AuthCancelDialog.Hide();
    // 关闭应用
    Application.Current.Exit();
}

// 示例:Azure验证启动方法
private async Task StartAzureAuthFlowAsync()
{
    try
    {
        // 替换为你的交互式浏览器凭据验证代码
        var credential = new InteractiveBrowserCredential(new InteractiveBrowserCredentialOptions
        {
            // 你的配置项
        });
        var token = await credential.GetTokenAsync(new TokenRequestContext(new[] { "https://management.azure.com/.default" }));
        // 验证成功后的后续逻辑
    }
    catch (OperationCanceledException)
    {
        // 用户关闭浏览器窗口时触发,显示自定义弹窗
        await AuthCancelDialog.ShowAsync();
    }
}

3. 关键细节说明

  • 必须将ContentDialog的默认按钮(Primary/Secondary/Close)设为Collapsed,避免默认按钮栏显示。
  • 使用HyperlinkButton实现链接样式的取消按钮,自带标准链接视觉样式,无需额外自定义。
  • 弹窗关闭需手动调用Hide(),因为默认按钮的自动关闭逻辑已禁用。
  • 通过捕获OperationCanceledException检测用户关闭浏览器窗口的行为,触发自定义弹窗。

替代方案:自定义Popup

如果需要更灵活的布局,可使用Popup控件实现完全自定义的模态弹窗,但需自行处理背景遮罩与焦点锁定,步骤稍复杂:

  1. 在窗口根布局中添加Popup,设置半透明背景遮罩。
  2. Popup内容为包含提示文本和链接按钮的自定义面板。
  3. 处理按钮点击事件关闭Popup或重启验证。

不过针对你的场景,自定义ContentDialog内容区域是最简便且符合WinUI3设计规范的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:32:41