我想要的是我的消息箱應該在其標題欄中顯示我的應用程序的圖標(或任何其他圖標),但它沒有,爲什麼不呢?WPF:爲什麼沒有messagebox在標題欄上有圖標
回答
MessageBox
in WPF只是標準MessageBox
in user32.dll
的包裝,它與Windows本身調用的顯示對話框的功能完全相同。在任何其他依賴於Win32 API的應用程序(包括WinForms,MFC等)中,WPF應用程序不會有任何不同。
使用反射器,您可以通過查看WPF中的MessageBox
調用的相關函數來驗證此情況。注意具體的代碼的最後一行,它調用UnsafeNativeMethods.MessageBox
:
[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));
}
正如你已經注意到,此消息對話框不顯示其標題欄上的圖標。這是因爲其窗口沒有指定WS_CAPTION
和WS_SYSMENU
樣式。並且while possible,有沒有簡單的方法來繼承user32.dll提供的MessageBox
和change its window styles以在其標題欄上顯示圖標。由此產生的代碼非常繁瑣,坦白地說不值得麻煩。
最好的解決方案是簡單地創建自己的對話框,然後從代碼中調用這個對話框。除了添加圖標之外,這還有其他許多優點,包括修復WPF的任何互操作性問題(您將使用完全託管的代碼),並允許您根據需要設置主題對話框,以匹配應用程序中使用的自定義主題。嘗試這樣的事情來幫助你開始。
或者,如果您不需要針對以前版本的Windows(那些Vista之前的),你可以使用COMCTRL32.DLL第6版所提供的TaskDialog
,它取代並增強了標準MessageBox
。但是,這並不包含在.NET Framework中作爲標準類,因此您必須使用P/Invoke。有關許多可用示例之一,請參閱here。
還有一些示例項目值得研究,它利用了Windows版本中的TaskDialog
,並且在以前的版本中對其進行了仿真。 (我個人使用我的很多.NET應用程序非常類似的東西。)
您可以創建自己的自定義消息框 - 只需創建用戶控件(包括圖像,動畫,視頻或其他...)並調用ShowDialog,即可從this example開始。
- 1. android在標題欄中沒有圖標
- 2. qtip2沒有標題欄
- 3. 沒有收到標題欄
- 4. GetWindowRect沒有標題欄
- 5. qpdfview中沒有標題欄
- 6. 是否可以在標題欄中顯示沒有圖標的wpf窗口?
- 7. 爲什麼MessageBox沒有顯示?
- 8. 爲什麼有ActionBar圖標上的Alpha?
- 9. 從WNDCLASS切換到WNDCLASSEX後,在標題欄中沒有圖標
- 10. 標題欄上的圖標
- 11. 爲什麼我在antd中的圖標標籤沒有顯示
- 12. 沒有響應顯示在標題欄
- 13. 沒有標題欄Android主題
- 14. Xcode 5.沒有標題的標籤欄控制器 - 只有圖標
- 15. viewForHeaderInSection - 沒有標題返回什麼?
- 16. 爲什麼有些電子郵件沒有標題字符串?
- 17. Android:爲什麼我的圖標沒有出現在操作欄中?
- 18. 爲什麼標籤欄項目的徽章沒有更改
- 19. WPF自定義標題欄不工作,但都沒有例外
- 20. 爲什麼WPF控件沒有標籤屬性?
- 21. 指定MessageBox的任務欄圖標
- 22. 爲什麼BeautifulSoup沒有在HTML中顯示標題
- 23. 沒有標題的圖片
- 24. 移動沒有標題欄的表單
- 25. 沒有標題/動作欄的活動
- 26. Python/Tkinter:刪除標題欄沒有overrideredirect()
- 27. 沒有標題的WordPress動態邊欄
- 28. 沒有標題欄的簡單窗口
- 29. 沒有顯示工具欄標題
- 30. QT4拖動窗口沒有標題欄
是的,我可以創造一個,但我問題是要找出原因,爲什麼它在BCL中默認不可用 – 2010-11-18 12:10:24