为什么WPF在不同版本的Windows上呈现不同?

问题描述:

我读过WPF在底层使用DirectX来执行其渲染,它不依赖于WinForms用于呈现控件的恐龙库。为什么WPF在不同版本的Windows上呈现不同?

因此,我使用WPF制作了我的Presentation层,它看起来应该在Win8下应用。

然后,我将项目部署到Windows Server 2003 ...以发现我的漂亮的小自定义消息框看起来非常像WinForms,有点笨重;按钮控件与WinForms控件非常相似,扩展控件不再显示为带圆圈的^箭头,并且看起来像是1998年绘制的(当您的鼠标悬停在屏幕上时,会弹出一个丑陋的方形平面按钮上的^箭头图片它)。

临WPF在C#2010圣经:WPF的承诺

部分是,你并不需要担心特定硬件的细节和特性。 WPF足够智能,可以尽可能地使用硬件优化,但它有一个软件后备的一切。 因此,如果您在具有旧版视频卡的计算机上运行WPF应用程序,该界面仍将以您设计它的方式出现

那么,这是谎言吗?对我来说它是,因为它不会出现我设计它的方式

如果不是这样,那么为什么/不管这台机器运行它的时候,该物体的渲染效果如何? 软件后备设计模仿Win32/GDI渲染?有没有办法让我的小自定义消息框在Win8和WinServer2K3上看起来完全相同?

+0

这可能是与实际的视频支持,winserver有问题。 Ala如果你有一个半透明的背景我不相信winserver甚至有能力做到这一点。 – Nomad101 2013-05-01 19:48:48

+0

+1只适用于“恐龙winforms”。 – 2013-05-01 19:57:32

这与DirectX /渲染/视频卡/任何一点没有关系。

以及WPF采用Windows主题中所有UI元素的DEFAULT外观所做的一切。

如果不希望这种行为,你必须为所有UI元素类型提供StylesTemplates,或以其他方式找到一种方法,包括在应用程序中PresentationFramework.Aero.dll并使用它作为默认的主题库。

看看this answer

+0

优秀且非常令人鼓舞的出发点,但是当表现层是类库(如仅包含XAML定义的MyApp.Presentation.Views项目)时,我/何处/如何应用此解决方案,启动事件*?我的意思是PresentationFramework.Aero.dll的方式,而不是样式和模板的方式。 http://arbel.net/2006/11/03/forcing-wpf-to-use-a-specific-windows-theme/ - 我有一个“启动”入口点(用于DI/IoC设置),但这是在只包含商业逻辑的“MyApp”项目中......不适合放在那里! – 2013-05-01 20:28:53

+0

好吧,我会将其标记为答案,因为它*会*如上所述回答问题。我会喜欢更详细的*例子,否则找到一种方法来在您的应用程序中包含PresentationFramework.Aero.dll,并将其用作默认主题库*,但我想这超出了问题的范围。 – 2013-05-02 13:01:46