c# - 模拟 ShowDialog 功能

标签 c# wpf events dialog messagebox

我正在编写一个应用程序 (c# + wpf),其中所有模态样式对话框都作为 UserControl 在覆盖主 Window 的半透明网格之上实现。这意味着只有一个 Window,它保持所有公司应用程序的外观。

要显示一个MessageBox,语法如下:

CustomMessageBox b = new CustomMessageBox("hello world");
c.DialogClosed += ()=>
{
   // the rest of the function
}
// this raises an event listened for by the main window view model,
// displaying the message box and greying out the rest of the program.
base.ShowMessageBox(b); 

如您所见,与经典的 .NET 版本相比,不仅执行流程实际上是颠倒的,而且冗长得可怕:

MessageBox.Show("hello world");
// the rest of the function

我真正想要的是一种在对话框关闭事件被引发之前不从 base.ShowMessageBox 返回的方法,但我看不出如何在没有它的情况下等待它挂起 GUI 线程,从而阻止用户单击“确定”。我知道我可以将委托(delegate)函数作为 ShowMessageBox 函数的参数,这可以防止执行反转,但仍然会导致一些疯狂的语法/缩进。

我是否遗漏了一些明显的东西,或者是否有标准的方法来做到这一点?

最佳答案

您可能想看看 this关于 CodeProject 和 this 的文章MSDN 上的文章。第一篇文章将引导您手动创建阻塞模式对话框,第二篇文章说明了如何创建自定义对话框。

关于c# - 模拟 ShowDialog 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1826781/

相关文章:

c# - 实体类型 'ModeratedUser'需要定义主键

c# - WPF 拖动距离阈值

javascript - 在 JavaScript 中同步模糊和点击事件

javascript - 处理父网页中的 iFrame 事件

jQuery 1.7 clientX/pageX 未定义

c# - 任何内置方法只知道两个列表是否不同?

c# 接口(interface)实现 - 为什么不构建?

c# - 在 C# 的 ListBox 中添加 ListBoxItem?

wpf - 无法从程序集 PresentationFramework 加载类型 'System.Windows.Controls.Primitives.MultiSelector'

c# - 键盘焦点到 DataGrid