Система.Окна.MessageBox против системы.Окна.Формы.MessageBox

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

4 ответов


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.


следует отметить еще один момент:

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

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


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