我有一个带YesNoCancel按钮的消息框......
Yes将执行一些操作并关闭应用程序 - 工作正常No将无效并关闭应用程序 - (见下文)Cancel将不执行任何操作并保持应用程序打开 - (见下文).我使用DialogResult.No的No按钮,并DialogResult.Cancel为Cancel按钮.但按其中任何一个都会触发DialogResult.Cancel事件.有什么问题?
我有一个WPF应用程序,它在ViewModel中调用MessageBox.Show()方式(以检查用户是否真的要删除).这实际上是有效的,但是违背了MVVM,因为ViewModel不应该明确地确定View上发生了什么.
所以现在我在想如何在我的MVVM应用程序中最好地实现MessageBox.Show()功能,选项:
我可以收到一条短信,上面写着"你确定......?" 以及我的XAML中的边框中的两个按钮是和否全部,并在模板上创建一个触发器,使其基于名为AreYourSureDialogueBoxIsVisible的ViewModelProperty折叠/可见,然后当我需要此对话框时,将AreYourSureDialogueBoxIsVisible指定为"true" "还可以通过我的ViewModel中的DelegateCommand处理这两个按钮.
我也可以尝试用XAML中的触发器来处理这个问题,这样删除按钮实际上只会使一些Border元素出现,其中包含消息和按钮,而Yes按钮实际上是删除了.
对于曾经使用MessageBox.Show()的几行代码而言,这两种解决方案似乎都过于复杂.
您在哪些方面成功实现了MVVM应用程序中的Dialogue Box?
我最近发现默认情况下默认情况下MessageBoxes不是最顶级的形式,我想知道是否有人知道你不希望消息框显示在其他窗口之上的任何情况?
当我开始在加载应用程序时显示启动画面时,我发现了这个问题,看起来我的程序仍在运行,但是MessageBox在启动画面后面等待输入...启动画面显示在不同的线程上调用消息框的线程所以我想这就是为什么它没有出现在启动之上; 但这仍然无法解释为什么MessageBox MB_TOPMOST默认没有标志?
编辑
为了更好地澄清:最后我不得不做一些与此类似的事情来制作一个消息框,代码并不完全正确,就像从内存中写的那样)
[DllImport("User32.dll")]
private int extern MessageBox(windowhandle, message, caption, flag);
public static void MessageBox(windowhandle, string message, string caption)
{
MessageBox(windowhandle, message,caption, MB_TOPMOST);
}
Run Code Online (Sandbox Code Playgroud) 如何将默认Windows样式应用于MessageBoxWPF中的标准?
例如,当我执行下一个代码时:
MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButton.OKCancel,
MessageBoxImage.Exclamation);
Run Code Online (Sandbox Code Playgroud)
我收到消息框:

但是在WinForms中,风格一切都很好:
MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButtons.OKCancel,
MessageBoxIcon.Exclamation);
Run Code Online (Sandbox Code Playgroud)

我接受了MUG4N对这个问题的回答,我也想回应一些针对它提出的批评.
克里斯夫说:
...您无法直接从后台线程进行UI调用.
这是一个一揽子声明,并非100%正确.我只想指出一些事实:
实际上,你可以使UI呼吁所有你想要的,如果你设置Control.CheckForIllegalCrossThreadCalls = false."确认!" 我听你说."不要永远做!" 是的,是的 - 但为什么呢?答案:因为有时这会破坏记忆.
中的控件类System.Windows.Forms不是编写为线程安全的,因此有时从后台线程更新它们可能会破坏内存.但是,如果这种情况有时只发生而且并非总是如此,那么这告诉我的不是UI代码本身的调用,而是可能导致异常的UI代码的潜在不安全冲突.
为了强调第1点,请考虑以下事项:从后台线程调用UI代码的"安全"方法是使用Control.Invokeor Control.BeginInvoke,对吗?但这是一个UI调用 ; 如果我们从非GUI线程更新GUI,那只是我们应该进行的 UI调用.我的意思是,显然,它不是简单地Control从外部线程调用对象的"任何"方法,这将导致混乱(如果是这种情况,那么我们甚至无法调用Invoke,我们将被完全卡住) .同样,它是单独的UI调用的潜在冲突,它们不能同时安全地发生,这将证明具有破坏性.
牢记以上两点,请问自己:为什么MessageBox.Show从非GUI线程调用会不安全?Form创建并显示完全独立的内容; 它的属性不以任何方式与任何其他现有GUI对象交互; 事实上,它不能以任何方式在任何地方访问,除了一个:来自调用线程,它访问其属性(并且只通过方法的返回值).DialogResultShow
继续前进.康拉德·阿尔布雷希特说:
...鉴于断言Show()在Dan的ref'd主题中设置了自己的消息泵,(这没有证实,但我不能反驳)......
这是一个完全公平的观点(尽管我个人非常尊重贾里德帕尔,我通常不会怀疑他说的是什么).无论如何,MessageBox.Show通过Reflector查看方法会显示以下片段:
Application.BeginModalMessageLoop();
try
{
result …Run Code Online (Sandbox Code Playgroud) 在asp.net的Windows窗体应用程序中,在C#代码后面你可以使用:
MessageBox.Show("Here is my message");
Run Code Online (Sandbox Code Playgroud)
在asp.net Web应用程序中是否有任何等价物?我可以从后面的C#代码中调用一些可以向用户显示消息框的内容吗?
示例用法:我有一个按钮,可以在后面的代码中加载文件.加载文件或出现错误时,我想向用户弹出一条消息,说明结果.
有什么想法吗?
我们的一些非技术用户遇到问题,我们的应用程序中的对话框有时可能会显示在主窗体后面,并且应用程序不接受任何输入,直到消息框(他们看不到)被取消.
应用程序是用C#编写的,消息框是标准的,例如代码可以像MessageBox.Show(消息,标题)一样简单,消息框可以由主UI线程创建(即不是某些后台线程).应用程序不必全屏运行,但我们90%的用户都是全屏运行它.
大多数时候((可能> 99%)消息框显示正确,我从来没有设法看到它出错了,但我看到一台机器出错了.
我注意到的一件事是,如果你有一个显示对话框的应用程序,那么当你查看你的任务管理器时,你只能在应用程序列表中看到一个条目.每当隐藏消息框时,您将看到两个条目,一个用于主应用程序,另一个用于此消息框.
一旦你知道发生了什么事情就很容易解决问题,但是我们的一些非技术用户对此感到困惑并最终关闭了他们的计算机.(而那些使用远程桌面的人在解决问题时更加困惑).
我不认为它与操作系统有关,因为我已经看到它发生在Vista中并且被告知它也发生在Windows 2003服务器上的终端会话中.
有什么事情知道为什么会发生这种情况,更重要的是,如果可以做任何事情来避免它吗?
messagebox ×10
c# ×7
winforms ×3
button ×2
wpf ×2
.net ×1
asp.net ×1
blocking ×1
class ×1
code-behind ×1
mvvm ×1
nonblocking ×1
topmost ×1
triggers ×1
vb.net ×1