The MessageBox in WPF http://msdn.microsoft.com/en-us/library/system.windows.messagebox(v=VS.100).aspx只是标准的包装MessageBox in user32.dll http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx,这与 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
and WS_SYSMENU
风格。和虽然可能 http://msdn.microsoft.com/en-us/magazine/cc188920.aspx,没有简单的方法来子类化 user32.dll 提供的MessageBox
and 更改其窗口样式 http://support.microsoft.com/kb/179582在其标题栏上显示一个图标。生成的代码很丑陋,坦率地说,不值得这么麻烦。
最好的解决方案是简单地创建您自己的对话框并从您的代码中调用此对话框。除了添加图标的能力之外,这还有很多其他优点,包括修复与 WPF 的任何互操作性问题(您将使用完全托管的代码),并允许您根据需要对对话框进行主题化以匹配应用程序中使用的自定义主题。尝试这样的事情来帮助您入门。
- http://blogsprajeesh.blogspot.com/2009/12/wpf-messagebox-custom-control.html http://blogsprajeesh.blogspot.com/2009/12/wpf-messagebox-custom-control.html
或者,如果您不需要针对以前版本的 Windows(Vista 之前的版本),您可以使用TaskDialog http://msdn.microsoft.com/en-us/library/bb787471(VS.85).aspxCOMCTRL32.DLL 版本 6 中提供,它取代并增强了标准MessageBox
。但是,它并未作为标准类包含在 .NET Framework 中,因此您必须P/Invoke http://www.pinvoke.net/default.aspx/comctl32.taskdialog. See here http://community.bartdesmet.net/blogs/bart/archive/2006/09/26/4470.aspx对于许多可用的示例之一。
还有一些值得研究的示例项目,它们利用了TaskDialog
在可用的 Windows 版本上,在不可用的早期版本中模拟它。 (我个人在许多 .NET 应用程序中使用了非常相似的东西。)
http://www.codeproject.com/KB/vb/vdialog.aspx http://www.codeproject.com/KB/vb/vdialog.aspx
http://www.codeproject.com/KB/WPF/WPFTaskDialogVistaAndXP.aspx http://www.codeproject.com/KB/WPF/WPFTaskDialogVistaAndXP.aspx
http://www.codeproject.com/KB/vista/TaskDialogWinForms.aspx http://www.codeproject.com/KB/vista/TaskDialogWinForms.aspx