System.Windows.MessageBox 与 System.Windows.Forms.MessageBox

Posted

技术标签:

【中文标题】System.Windows.MessageBox 与 System.Windows.Forms.MessageBox【英文标题】:System.Windows.MessageBox vs System.Windows.Forms.MessageBox 【发布时间】:2011-06-07 07:56:42 【问题描述】:

我很难找出两个消息框之间的主要区别。 System.Windows.MessageBoxSystem.Windows.Forms.MessageBox 有什么区别?

【问题讨论】:

您在 cmets 中两次提到一个消息框“破坏了您的绑定”,您能否澄清一下,或者您是否按照建议就该主题提出了另一个问题? 【参考方案1】:

System.Windows.MessageBox 是随 WPF 添加的,并且存在于 WPF 程序集 (PresentationFramework.dll) 中。

System.Windows.Forms.MessageBox 是随 Windows 窗体添加的,并且存在于 Windows 窗体程序集中。

如果您的程序是 Windows 窗体程序,我会使用后者 (System.Windows.Forms.MessageBox),因为它不会依赖 WPF。另一方面,如果您正在为 WPF 开发,我会使用 System.Windows.MessageBox

【讨论】:

感谢您的回答!我正在使用 WPF 表单,我对此感到好奇的原因之一是当我使用 System.Windows.MessageBox 时,它导致我的一些绑定中断。当我切换到 System.Windows.Forms.MessageBox 时,我的绑定完好无损。 MessageBox 的某些实现方面是否可能会破坏我的绑定?谢谢 @MisterXero:不——它根本不应该有任何影响。您可能想问另一个问题,解释您正在做什么(使用代码示例)...【参考方案2】:

还有一点需要注意:

如果您想在既不是 Windows 窗体应用程序也不是窗体应用程序(例如 .NET 控制台应用程序)的应用程序中显示消息框,则不应拖入程序集引用,因为这似乎很常见整个互联网的口头禅。

相反,您应该使用 pinvoke 并调用 User32,如下所示:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern MessageBoxResult MessageBox(IntPtr hWnd, String text, String caption, int options);

/// <summary>
/// Flags that define appearance and behaviour of a standard message box displayed by a call to the MessageBox function.
/// </summary>
[Flags]
public enum MessageBoxOptions : uint

    Ok = 0x000000,
    OkCancel = 0x000001,
    AbortRetryIgnore = 0x000002,
    YesNoCancel = 0x000003,
    YesNo = 0x000004,
    RetryCancel = 0x000005,
    CancelTryContinue = 0x000006,

    IconHand = 0x000010,
    IconQuestion = 0x000020,
    IconExclamation = 0x000030,
    IconAsterisk = 0x000040,
    UserIcon = 0x000080,
    IconWarning = IconExclamation,
    IconError = IconHand,
    IconInformation = IconAsterisk,
    IconStop = IconHand,
    DefButton1 = 0x000000,
    DefButton2 = 0x000100,
    DefButton3 = 0x000200,
    DefButton4 = 0x000300,

    ApplicationModal = 0x000000,
    SystemModal = 0x001000,
    TaskModal = 0x002000,

    Help = 0x004000, //Help Button
    NoFocus = 0x008000,

    SetForeground = 0x010000,
    DefaultDesktopOnly = 0x020000,
    Topmost = 0x040000,
    Right = 0x080000,
    RTLReading = 0x100000,


/// <summary>
/// Represents possible values returned by the MessageBox function.
/// </summary>
public enum MessageBoxResult : uint

    Ok = 1,
    Cancel,
    Abort,
    Retry,
    Ignore,
    Yes,
    No,
    Close,
    Help,
    TryAgain,
    Continue,
    Timeout = 32000


var result = User32.MessageBox(IntPtr.Zero, "Debugging Break", "Your Console Application", (int)User32.MessageBoxOptions.Ok);

【讨论】:

JFYI:来自 WPF Presentation Framework 的 System.Windows.MessageBox 只是围绕此调用的托管包装器。 WPF MessageBox 实际上不是 WPF 窗口。因此,如果您对 @stacy 的建议有所保留,请不要保留。【参考方案3】:

据我所知,两者最终都会调用相同的低级 Windows API...

【讨论】:

有趣...当我使用 system.windows.messagebox 时,它会破坏我的 WPF 表单上的绑定,但 system.windows.forms.messagebox 不会。任何想法为什么它可能会这样做? @MisterXero “打破绑定”到底是什么意思?使用全名添加程序集引用不应破坏任何内容。两者在不同的命名空间中都有一个内部 UnsafeNativeMethods 类,其作用大致相同,但 WPF 实现更优雅。【参考方案4】:

两者基本上做同样的事情,除了 system.windows.messagebox 是 WPF 和 system.windows.forms.messagebox 是 Windows 窗体。如果你使用 WPF 使用前者,WinForms 使用后者。

【讨论】:

以上是关于System.Windows.MessageBox 与 System.Windows.Forms.MessageBox的主要内容,如果未能解决你的问题,请参考以下文章

关闭 WPF 应用程序后 System.Windows.MessageBox.Show() 在后台保持打开状态

wpf新手。。 就是做了一个很简单的radiobutton四选一单选题,生成结果总是出错

如何根据对MessageBox的响应阻止用户使用Powershell注销或锁定工作站?

将DataTable中的数据导出到Excel

列出 ForEach 休息时间

C# WPF TextBlock 可见性在 StoryBoard 之后没有改变