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控件实现完全自定义的模态弹窗,但需自行处理背景遮罩与焦点锁定,步骤稍复杂:
- 在窗口根布局中添加Popup,设置半透明背景遮罩。
- Popup内容为包含提示文本和链接按钮的自定义面板。
- 处理按钮点击事件关闭Popup或重启验证。
不过针对你的场景,自定义ContentDialog内容区域是最简便且符合WinUI3设计规范的方案。
内容的提问来源于stack exchange,提问作者user3766691
相关产品推荐
相关产品推荐

