System.Windows.MessageBox против System.Windows.Forms.MessageBox - PullRequest
20 голосов
/ 11 января 2011

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

Ответы [ 4 ]

23 голосов
/ 11 января 2011

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.

9 голосов
/ 23 января 2011

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

Если вы хотите отобразить окно сообщения в приложении, которое не является ни приложением Windows Forms, ни приложением форм (например, консольным приложением .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);
2 голосов
/ 11 января 2011

Насколько я знаю, оба в конечном итоге вызывают один и тот же API-интерфейс Windows низкого уровня ...

2 голосов
/ 11 января 2011

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

...