System.Windows.MessageBox和System.Windows.Forms.MessageBox的区别

28
我在查找两个消息框之间的主要区别时遇到了困难。 System.Windows.MessageBoxSystem.Windows.Forms.MessageBox 之间有什么区别?请帮忙解答。

你在注释中提到了两次,有一个消息框“破坏了你的绑定”,你能否澄清一下,或者像建议的那样,另起一题讨论这个问题? - TheZenker
4个回答

30

System.Windows.MessageBox是WPF中新增加的类,存在于WPF程序集(PresentationFramework.dll)中。

System.Windows.Forms.MessageBox是Windows Forms中新增加的类,存在于Windows Forms程序集中。

如果您正在开发一个Windows Forms程序,建议使用后者 (System.Windows.Forms.MessageBox),因为它不会引入对WPF的依赖。另一方面,如果您正在为WPF开发,应该使用System.Windows.MessageBox


谢谢你的回答!我正在使用一个WPF表单,我好奇的原因之一是当我使用System.Windows.MessageBox时,它会导致我的一些绑定断开。当我切换到System.Windows.Forms.MessageBox时,我的绑定保持完好无损。是否有MessageBox的某些实现方面可能会破坏我的绑定?谢谢。 - MisterXero
@MisterXero:不会有任何影响。你可能需要提出另一个问题,解释一下你正在做什么(附带代码示例)... - Reed Copsey

11

还需要注意一点:

如果您想在既不是 Windows Forms 应用程序也不是 Forms 应用程序(例如 .NET 控制台应用程序)的应用程序中显示消息框,则不应该像互联网上普遍建议的那样拖入 Windows Forms 或者 Forms 的程序集引用。

相反,您应该使用 ,并按照以下方式调用 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);

3
JFYI:WPF演示框架中的System.Windows.MessageBox只是这个调用的托管包装器。WPF MessageBox实际上不是一个WPF窗口。因此,如果您对@stacy建议的做法持有保留意见,那就不要有这些保留了。 - jrwren

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

有趣的是...当我使用 system.windows.messagebox 时,它会破坏我的 WPF 表单上的绑定,但 system.windows.forms.messagebox 却不会。有什么想法为什么会这样? - MisterXero
@MisterXero,您所说的“断开绑定”具体是什么意思?添加程序集引用并使用完整名称不应该会造成任何问题。两者都有一个内部的UnsafeNativeMethods类位于不同的命名空间中,具有相似的功能,虽然WPF实现更为优雅。 - mbx

2

这两个基本上都是做同样的事情,只不过system.windows.messagebox是WPF的,而system.windows.forms.messagebox是Windows Forms的。如果你在使用WPF,请使用前者;如果你在使用WinForms,请使用后者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接