WinUI3中如何以编程方式关闭MessageDialog
WinUI .NET 5 MessageDialog点击后无法自动消失解决方案
该问题的核心原因是WinUI 3中MessageDialog属于兼容遗留API,未默认绑定按钮关闭回调,部分早期版本的Windows App SDK还存在该API的已知bug。
方案1:使用官方推荐的ContentDialog替换(优先选择)
MessageDialog在WinUI 3中已不推荐使用,官方建议用原生ContentDialog替代,不存在关闭异常问题,示例代码如下:
private async void TargetButton_Click(object sender, RoutedEventArgs e) { ContentDialog dialog = new ContentDialog { Title = "操作提示", Content = "你的操作已执行完成", CloseButtonText = "确定" }; // 必须指定XamlRoot,否则会出现弹窗定位、无法关闭等异常 dialog.XamlRoot = this.Content.XamlRoot; await dialog.ShowAsync(); }
方案2:兼容旧代码保留MessageDialog的修复方法
如果需要兼容原有逻辑不替换API,按以下步骤调整:
- 确保MessageDialog在UI线程调用,后台线程调用时需要用
DispatcherQueue.TryEnqueue包裹 - 手动给按钮绑定回调,补全默认关闭逻辑,示例代码如下:
private async void ShowLegacyMessageDialog() { var messageDialog = new Windows.UI.Popups.MessageDialog("提示内容", "提示标题"); // 添加按钮并绑定空回调即可触发默认关闭逻辑 messageDialog.Commands.Add(new Windows.UI.Popups.UICommand("确定", _ => { })); messageDialog.DefaultCommandIndex = 0; messageDialog.CancelCommandIndex = 0; await messageDialog.ShowAsync(); }
排查点:升级Windows App SDK版本
早期预览版的Windows App SDK存在MessageDialog无法关闭的已知bug,可将NuGet包Microsoft.WindowsAppSDK升级到最新稳定版即可修复。
内容的提问来源于stack exchange,提问作者David Simões
相关产品推荐
相关产品推荐

