gpt4 book ai didi

WPF : why doesnt messagebox have icon on titlebar

转载 作者:行者123 更新时间:2023-12-04 15:46:24 25 4
gpt4 key购买 nike

我想要的是我的消息框应该在其标题栏中显示我的应用程序的图标(或任何其他图标),但它没有,为什么不呢?

最佳答案

MessageBox in WPF只是标准 MessageBox in user32.dll 的包装器,这与 Windows 本身调用以显示对话框的函数完全相同。在您的 WPF 应用程序中,它与在依赖 Win32 API(包括 WinForms、MFC 等)的任何其他应用程序中看起来没有任何不同。

使用 Reflector,您可以通过查看 MessageBox 调用的相关函数来验证这一点。在 WPF 中。特别注意最后一行代码,它调用 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 的任何互操作性问题(您将使用完全托管的代码),并允许您根据需要为对话框设置主题以匹配应用程序中使用的自定义主题.尝试这样的事情来帮助您入门。
  • http://blogsprajeesh.blogspot.com/2009/12/wpf-messagebox-custom-control.html

  • 或者,如果您不需要针对以前版本的 Windows(Vista 之前的版本),您可以使用 TaskDialog COMCTRL32.DLL 的第 6 版中提供,它取代并增强了标准 MessageBox .但是,这并未作为 .NET Framework 中的标准类包含在内,因此您必须 P/Invoke .见 here对于许多可用示例之一。

    还有几个示例项目值得研究,它们利用了 TaskDialog在它可用的 Windows 版本上,并在它不可用的以前版本中模拟它。 (我个人在我的许多 .NET 应用程序中使用了非常相似的东西。)
  • http://www.codeproject.com/KB/vb/vdialog.aspx
  • http://www.codeproject.com/KB/WPF/WPFTaskDialogVistaAndXP.aspx
  • http://www.codeproject.com/KB/vista/TaskDialogWinForms.aspx
  • 关于WPF : why doesnt messagebox have icon on titlebar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4212188/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com