System.Windows.MessageBox vs System.Windows.Forms.MessageBox

У меня возникли проблемы с выяснением, какие ключевые отличия между двумя ящиками сообщений. В чем разница между System.Windows.MessageBox и System.Windows.Forms.MessageBox?

Ответ 1

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.

Ответ 2

Следует отметить еще одну точку:

Если вы хотите отображать окно сообщения в приложении, которое не является ни приложением форм Windows, ни приложением формы (например, консольным приложением .NET), вы не должны перетаскивать ссылки на сборки, как это кажется обычным мантра по всему миру.

Вместо этого вы должны использовать и вызовите 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

Оба в основном делают то же самое, кроме system.windows.messagebox является WPF и system.windows.forms.messagebox является Windows Forms. Если вы используете WPF, используйте первый, для WinForms используйте последний.

Ответ 4

Оба в конечном итоге называют тот же API окон нижнего уровня, насколько я знаю...