2011-01-11 13 views
11

Mam problem ze znalezieniem głównych różnic między tymi dwoma skrzynkami. Jaka jest różnica między System.Windows.MessageBox i System.Windows.Forms.MessageBox?System.Windows.MessageBox kontra System.Windows.Forms.MessageBox

+0

można wymienić dwa razy, w komentarzach, że jedno okno komunikatu „łamie swoje powiązania” można wyjaśnić, czy może, jak sugeruje, zaczęło się kolejne pytanie na ten temat? – TheZenker

Odpowiedz

17

System.Windows.MessageBox został dodany z WPF i istnieje w ramach zespołów WPF (PresentationFramework.dll).

System.Windows.Forms.MessageBox został dodany do Windows Forms i istnieje w zestawach Windows Forms.

Jeśli twój program jest programem Windows Forms, używałbym tego ostatniego (System.Windows.Forms.MessageBox), ponieważ nie będzie on pobierał zależności od WPF. Z drugiej strony, jeśli tworzysz dla WPF, użyłbym System.Windows.MessageBox.

+0

Dzięki za odpowiedź! Korzystam z formularza WPF i jednym z powodów, dla których byłem ciekawy tego, kiedy użyłem System.Windows.MessageBox, było to, że niektóre z moich powiązań zostały przerwane. Po przełączeniu do System.Windows.Forms.MessageBox moje powiązania pozostały nienaruszone. Czy istnieją pewne aspekty implementacji MessageBox, które mogą zrywać moje powiązania? Dzięki – MisterXero

+0

@MisterXero: Nie - nie powinno to mieć żadnego wpływu. Możesz zadać inne pytanie wyjaśniające, co robisz (z próbkami kodu) do tego ... –

2

Obie w zasadzie robią to samo, z wyjątkiem system.windows.messagebox jest WPF i system.windows.forms.messagebox jest Windows Forms. Jeśli używasz WPF, użyj pierwszego, a WinForm używa tego drugiego.

1

Zarówno ostatecznie nazwać ten sam niski poziom Windows API o ile wiem ...

+0

Interesujące ... Kiedy używam system.windows.messagebox, łamie ono powiązanie mojego formularza WPF, ale system.windows. forms.messagebox nie. Jakieś pomysły, dlaczego tak się dzieje? – MisterXero

+0

@MisterXero co dokładnie masz na myśli mówiąc "łamie wiązanie"? Dodanie odwołania do zestawu i użycie pełnej nazwy nie powinno niczego przerwać. Oba mają wewnętrzną klasę 'UnsafeNativeMethods' w różnych przestrzeniach nazw mniej więcej tak samo, chociaż implementacja WPF jest bardziej elegancka. – mbx

8

Jeden dodatkowy punkt należy zauważyć:

Jeśli chcesz wyświetlić okno wiadomości w aplikacji, która nie jest ani aplikacji formularzy systemu Windows lub aplikacji formularzy (na przykład aplikacji konsoli .NET), nie należy przeciągać odwołań do zestawów, ponieważ wydaje się, że jest to powszechna mantra w Internecie.

Zamiast tego należy użyć i zadzwonić do user32 następująco:

[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); 
+0

JFYI: System.Windows.MessageBox z WPF Presentation Framework jest tylko zarządzanym opakowaniem wokół tego wywołania. WPF MessageBox w rzeczywistości nie jest oknem WPF. Jeśli masz zastrzeżenia co do tego, co sugeruje @stacy, nie miej takich zastrzeżeń. – jrwren