Alles, was ich will, ist, dass meine Nachrichtenbox das Symbol meiner Anwendung (oder jedes andere Symbol) in der Titelleiste zeigen sollte, aber es tut nicht, warum nicht?WPF: Warum hat keine Nachrichtenbox ein Symbol auf der Titelleiste
Antwort
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.)
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.
- 1. Warum nur der letzte Menüpunkt Symbol hat?
- 2. So erstellen Sie ein Fenster, das keine Titelleiste hat move
- 3. WPF Titelleiste ändern Hintergrundfarbe
- 4. Wie wird das Symbol in der QDockWidget Titelleiste angezeigt?
- 5. Hauptfenster Titelleiste Farbwechsel in WPF
- 6. Ein anderes Taskleistensymbol auf das in der Titelleiste angezeigte Symbol (C#) setzen?
- 7. Warum hat der aktuelle Benutzer keine Daten?
- 8. wpf gridview hat keine Zeile ausgewählt Ereignis
- 9. WPF - Bindung an ein Menü-Symbol
- 10. Warum hat Map keine Kartenmethode?
- 11. Wpf Listview gebundenes Objekt hat keine Änderungen
- 12. Warum hat ActionScript keine "Generika"?
- 13. Warum hat Rust keine Gewerkschaften?
- 14. Wie Symbol für ein WPF auswählen, das Symbol der Anwendung zu sein?
- 15. Wie ein Menü oben auf die Titelleiste des Fensters zeigen
- 16. ListFragment zeigt keine Titelleiste in Android Studio
- 17. WPF Maus beschäftigt Symbol
- 18. Warum hat der Kanaltyp ein '<-'?
- 19. Zeichnen auf der Titelleiste in MFC
- 20. Warum hat GoogleAuth.then() keine Callbacks mehr aufgerufen?
- 21. Warum hat meine UITableViewCell keine textLabel -Eigenschaft?
- 22. Hat in WPF jemand ein Grid animiert?
- 23. WPF-Anwendung, die nur ein Tray-Icon hat
- 24. Warum hat keine Eigenschaft Auswirkungen in Ankhsvn?
- 25. Warum hat SerializationInfo keine TryGetValue-Methoden?
- 26. Warum hat das .NET-Framework keine Prioritätswarteschlangenklasse?
- 27. Warum hat meine C# keine System.ServiceProcess-Bibliothek?
- 28. Hinzufügen von Hilfe-Symbol zu WinForms Formular-Titelleiste
- 29. Warum hat ObservableCollection keine RemoveAll-Methode?
- 30. Warum hat setImageBitmap keine Auswirkungen auf benutzerdefiniertes ImageButton?
Ja ich erstellen kann, aber mein Frage war, einen Grund herauszufinden, warum es nicht standardmäßig in der BCL verfügbar ist –