2010-11-18 9 views

Antwort

5

Die MessageBox in WPF ist einfach ein Wrapper für den Standard MessageBox in user32.dll, die genau die gleiche Funktion ist, die Windows selbst aufruft, um ein Dialogfeld anzuzeigen. Es wird in Ihren WPF-Anwendungen nicht anders aussehen als in jeder anderen Anwendung, die auf der Win32-API basiert (einschließlich WinForms, MFC usw.).

Mithilfe von Reflector können Sie dies überprüfen, indem Sie sich die entsprechende Funktion ansehen, die von MessageBox in WPF aufgerufen wird. Beachten Sie insbesondere die letzte Codezeile, wo es UnsafeNativeMethods.MessageBox ruft:

[SecurityCritical] 
private static MessageBoxResult ShowCore(IntPtr owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options) 
{ 
    if (!IsValidMessageBoxButton(button)) 
    { 
     throw new InvalidEnumArgumentException("button", (int) button, typeof(MessageBoxButton)); 
    } 
    if (!IsValidMessageBoxImage(icon)) 
    { 
     throw new InvalidEnumArgumentException("icon", (int) icon, typeof(MessageBoxImage)); 
    } 
    if (!IsValidMessageBoxResult(defaultResult)) 
    { 
     throw new InvalidEnumArgumentException("defaultResult", (int) defaultResult, typeof(MessageBoxResult)); 
    } 
    if (!IsValidMessageBoxOptions(options)) 
    { 
     throw new InvalidEnumArgumentException("options", (int) options, typeof(MessageBoxOptions)); 
    } 
    if ((owner != IntPtr.Zero) && ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) != MessageBoxOptions.None)) 
    { 
     throw new ArgumentException(SR.Get(SRID.CantShowMBServiceWithOwner, new object[0])); 
    } 
    int type = (int) (((button | ((MessageBoxButton) ((int) icon))) | DefaultResultToButtonNumber(defaultResult, button)) | ((MessageBoxButton) ((int) options))); 
    IntPtr zero = IntPtr.Zero; 
    if ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) == MessageBoxOptions.None) 
    { 
     if (owner == IntPtr.Zero) 
     { 
      zero = UnsafeNativeMethods.GetActiveWindow(); 
     } 
     else 
     { 
      zero = owner; 
     } 
    } 
    return Win32ToMessageBoxResult(UnsafeNativeMethods.MessageBox(new HandleRef(null, zero), messageBoxText, caption, type)); 
} 

Wie Sie bemerkt haben, das Meldungsfeld nicht ein Symbol auf der Titelleiste nicht angezeigt. Dies liegt daran, dass das Fenster ohne Angabe der Stile WS_CAPTION und WS_SYSMENU erstellt wird. Und while possible, gibt es keine einfache Möglichkeit, die user32.dll-bereitgestellten MessageBox und change its window styles Unterklasse zu einem Symbol in der Titelleiste anzuzeigen. Der resultierende Code ist fugig und ehrlich gesagt nicht die Mühe wert.

Die beste Lösung besteht darin, einfach ein eigenes Dialogfeld zu erstellen und dieses stattdessen aus Ihrem Code aufzurufen. Dies bietet viele weitere Vorteile, die über die Möglichkeit zum Hinzufügen eines Symbols hinausgehen, einschließlich der Behebung von Interoperabilitätsproblemen mit WPF (Sie verwenden vollständig verwalteten Code) und das Anpassen des Dialogfelds an ein benutzerdefiniertes Thema, das in Ihrer Anwendung verwendet wird . Versuchen Sie etwas wie das, um Ihnen zu helfen, anzufangen.


Alternativ, wenn Sie frühere Versionen von Windows (die vor Vista) nicht zielen müssen, können Sie die TaskDialog in Version 6 von COMCTRL32.DLL vorgesehen verwenden, welches den Standard MessageBox ersetzt und erweitert. Dies ist jedoch nicht als Standardklasse in .NET Framework enthalten. Sie müssen also P/Invoke. Siehe here für eines von vielen verfügbaren Beispielen.

Es gibt auch ein paar Beispielprojekte, die einen Blick wert sind, die TaskDialog auf Windows-Versionen verwenden, wo es verfügbar ist, und es in früheren Versionen emulieren, wo es nicht ist. (Ich persönlich etwas sehr ähnlich in vielen meiner .NET-Anwendungen verwenden.)

0

Sie könnten Ihre eigene benutzerdefinierte Nachricht erstellen - nur ein Benutzersteuerelement erstellen (mit Ihren Bildern, Animationen, Videos oder was auch immer ...) und ShowDialog aufrufen, können Sie von this example starten.

+2

Ja ich erstellen kann, aber mein Frage war, einen Grund herauszufinden, warum es nicht standardmäßig in der BCL verfügbar ist –

Verwandte Themen