<Style TargetType="{x:Type ComboBox}" > <Setter Property="FontStyle" Value="Normal"/> <Setter Property="Height" Value="24" /> <Setter Property="Background" Value="{StaticResource GradientButtonBackgroundBrush}"/> </Style>
组合框背景属性在Windows 8中没有任何效果,我得到的是一个带有箭头的扁平矩形(默认的窗口8组合框,设计相当糟糕!).
所以,我的问题是如何在所有版本的Windows上使组合框看起来一样.我尝试在我的App.xaml中添加Windows Aero主题,如下所示,但它对组合框显示没有影响.这是我添加Aero主题的方式
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/PresentationFramework.Aero;component/themes/aero.normalcolor.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>
关于主题还有另一个疑问.我正在Windows 7机器上构建wpf应用程序,默认情况下(我相信)有Aero Theme设置.因此,在Windows 7计算机上查看时,我的所有样式都基于Aero主题.如果我在XP上运行应用程序会发生什么.那么我是否需要在App.xaml中添加资源字典(Aero主题)的条目,如上面的代码中所列?
我知道我的问题有点模糊,但请相信我,我对wpf在不同Windows版本上的默认主题感到困惑.
编辑:
我仍然无法根据我的需要获得组合框.组合框仍然看起来像一个灰色矩形.
这就是我做的.我从microsoft的网站下载了Aero.NormalColor.xaml,并将其包含在应用程序的themes文件夹中.然后我在App.xaml中添加了以下内容
<ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/Themes/Aero.NormalColor.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>
然后我编译了应用程序并部署在Windows 8上.仍然是如前所示的组合框.请注意,所有其他元素都根据主题进行了正确的样式设置.我对Luna.Metallic.xaml做了同样的事情,除了ComboBox之外,每个元素都有样式.
我相信当我加载一个用ControlTemplate定义样式的特定主题时,它应该被wpf选中.我很困惑为什么只有ComboBox即使给它一个Aero(或Luna)控制模板后也不会改变它的外观.有任何想法吗 ?
编辑-2
Windows 8上组合框外观的屏幕截图
如果你在Windows-8中查看该ToggleButton的样式,你会看到如下内容:
<ControlTemplate TargetType="{x:Type ToggleButton}"> <Border x:Name="templateRoot" Background="{StaticResource ComboBox.Static.Background}" BorderBrush="{StaticResource ComboBox.Static.Border}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true"> ...
从上面可以看出,使用的Background不是{TemplateBinding Background}而是{StaticResource ComboBox.Static.Background}.因此,当您在Windows-8中为该ComboBox设置Background属性时,为什么看不到任何效果
如果你想在不同的OS版本中携带一个Style(无需回溯并继续检查新版本是否搞砸了你的过度使用),简单的规则是自己创建它.
创建一个样式并将其设置为由TargetType应用,并且不使用Key来自动应用.这样在任何操作系统中都可以使用你的Style而不是默认的底层.
因此,这可以保证您的代码在每个操作系统上都能正常运行.将您的风格基于任何操作系统的默认设置,并根据您的内容进行调整.
边注:
从可用性POV为用户提供Windows-7 ComboBox在Windows-8上运行的应用程序不是很好(除非你的整个应用程序看起来像一个更糟糕的Windows-7应用程序).您期望用户习惯您的应用程序的样式,并忘记他在其操作系统中使用的每个其他应用程序中使用的内容,该应用程序使用基于操作系统的默认样式.如果您有特定的理由这样做,请继续,但请考虑其影响.
举个例子,你说Windows-8 Style是你不喜欢的东西,我恰恰相反.我实际上喜欢Windows-8干净简洁的外观.用户体验不会分散闪烁的渐变和让你摆脱放在他们面前的内容的东西.这是一个永远存在的争论.请注意最终用户期望和思考的内容,而不仅仅是您在编写程序时认为好的内容.
更新:
好的,对于你的问题编辑,你尝试过的东西在windows-8中没有用,因为在Windows-8中不存在PresentationFramework.Aero.dll,它就是Aero.NormalColor.xaml.在Windows-8中,您选择的是PresentationFramework.Aero2.dll,它是默认的,我认为是PresentationFramework.AeroLite.dll,Windows Server 2012使用它(不确定)
尝试在Windows-8上编译你的程序,你会发现它甚至不想编译.
您必须向您的项目明确添加对PresentationFramework.Aero和PresentationUI(我认为是.net3的一部分)的引用.
然后你必须编辑你的Aero.NormalColor.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:ui="clr-namespace:System.Windows.Documents;assembly=PresentationUI"> ...
^^我们明确说明Aero Theme的程序集.我不使用Windows-7所以我不确定是否只需要这些.但你可以尝试一下.
尝试在Windows-8中编译代码,以确保它在Windows-8上正常工作