首页 > 代码库 > 给WPF的MessageBox启用视觉样式

给WPF的MessageBox启用视觉样式

    WPF的MessageBox为什么会这样

  我的一个同学跟我说:“WPF不是新一代技术吗?怎么连MessageBox都没WinForm 的好看?”

  

技术分享

 

  上图是Windows Forms 的MesssageBox 与WPF 的MessageBox 的对比,我们发现,WPF没有启用视觉样式。

  有的朋友会问了,那既然WPF没有启用视觉样式,那为什么它的控件的外观和启用样式后一样呢?

  原因是这样的,WPF控件的绘制方式和普通程序不一样,它是采用DirectX 进行绘制的,而MessageBox 是在调用Windows API,所以MessageBox 没有采用DirectX 进行绘制,因此我们没能在MessageBox 上看到这种视觉样式。

  启用WPF应用程序的视觉样式

  我们都知道,Windows Forms应用程序在Main方法中会调用一个方法去启用视觉样式:

  Application.EnableVisualStyles();

  对于WPF我们可以用应用程序清单文件来解决这个问题。

  

技术分享

 

  首先,给项目添加一个应用程序清单文件。

  在清单文件的最后,微软已经为我们写好了启用视觉样式的代码,我们只要把它解注释就行。

<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->   <dependency>    <dependentAssembly>      <assemblyIdentity          type="win32"          name="Microsoft.Windows.Common-Controls"          version="6.0.0.0"          processorArchitecture="*"          publicKeyToken="6595b64144ccf1df"          language="*"        />    </dependentAssembly>  </dependency>

  把项目Rebuild一下,再运行,效果如下

  

技术分享

 

  怎么还是不行?楼主你骗人!!!

  别急,听我慢慢道来。

  我们打开应用程序生成的目录,

  

技术分享

 

  在这有两个exe,我们运行这个生成的WPFVisualStyle.WPF.exe,效果如下,怎么样,我没骗你吧?

  

技术分享

 

  为什么会这样

  好了,问题解决了,扯点别的东西。下面那个WPFVisualStyle.WPF.vshost.exe,看名字就知道是在Visual Studio 调试程序时的宿主进程,它是没有嵌入清单的。

  有的朋友可能会问,那我想在调试时看到视觉效果怎么办?

  其实这个就在项目属性的Debug选项卡下面,找到Enable Visual Studio hosting process,把前面的勾去掉,Visual Studio在调试时就会去调用WPFVisualStyle.WPF.exe,我们也就能看到视觉效果了。

  关于应用程序清单文件

  说了这么多,有的朋友可能对应用程序清单文件产生兴趣了,关于它的用法,这里给一篇MSDN的文档供大家参考。

  Manifest Files Reference (Windows)

  本文来自Hamson博客,原文地址:http://www.cnblogs.com/hamson/archive/2013/02/18/enable-wpf-messagebox-visualstyle.html

给WPF的MessageBox启用视觉样式