Combobox背景未应用于Windows 8

Jat*_*tin 8 wpf themes wpf-4.0

我对wpf主题有点困惑.我想让Vista,Windows 7和Windows 8上的wpf屏幕看起来一样.所以我相应地设计了组件,除了在Windows 8上运行外,它们不会出现问题.例如我有一个组合框,我就是像这样在xaml中更改其默认背景.

<Style TargetType="{x:Type ComboBox}" >
    <Setter Property="FontStyle" Value="Normal"/>
    <Setter Property="Height" Value="24" />
    <Setter Property="Background" Value="{StaticResource GradientButtonBackgroundBrush}"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

组合框背景属性在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>
Run Code Online (Sandbox Code Playgroud)

关于主题还有另一个疑问.我正在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>
Run Code Online (Sandbox Code Playgroud)

然后我编译了应用程序并部署在Windows 8上.仍然是如前所示的组合框.请注意,所有其他元素都根据主题进行了正确的样式设置.我对Luna.Metallic.xaml做了同样的事情,除了ComboBox之外,每个元素都有样式.

我相信当我加载一个用ControlTemplate定义样式的特定主题时,它应该被wpf选中.我很困惑为什么只有ComboBox即使给它一个Aero(或Luna)控制模板后也不会改变它的外观.有任何想法吗 ?

EDIT-2 Windows 8上组合框外观的屏幕截图 在此输入图像描述

Viv*_*Viv 2

那么ComboBox可点击区域实际上是ToggleButton

如果您在 Windows-8 中查看Style该内容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">
...
Run Code Online (Sandbox Code Playgroud)

从上面可以看出,Backgroundused 不是{TemplateBinding Background}but {StaticResource ComboBox.Static.Background}Background因此,为什么在 Windows-8 中设置该属性时看不到任何效果ComboBox

如果您希望Style跨不同的操作系统版本(无需回溯并不断检查新版本是否搞砸了您的覆盖),简单的规则就是自己创建。

创建 aStyle并将其设置为由 a 应用TargetType或不由 aKey应用以自动应用。这样,在任何操作系统中,都是您Style自己使用的,而不是默认的底层操作系统。

因此,这可以保证您的代码在每个操作系统上都能按您的预期运行。您的风格可以基于任何操作系统的默认设置,并根据您的喜好进行调整。

边注

从可用性的角度来看,在 Windows-8 上运行的应用程序中为用户提供 Windows-7ComboBox并不是很好(除非您的整个应用程序看起来像 Windows-7 应用程序,这甚至更糟)。您期望用户习惯您的应用程序的样式,并忘记他在操作系统中使用的所有其他应用程序所习惯的样式,这些应用程序使用基于操作系统的默认样式。如果您有这样做的具体原因,请继续,但一定要考虑其影响。

举例来说,您说您不喜欢 Windows-8 风格,那么我恰恰相反。事实上,我确实喜欢 Windows-8 干净简单的外观。不会因为闪烁的渐变和让您忘记放在用户面前的内容而干扰用户体验。这是一个永远持续下去的争论。在编写程序时,请注意最终用户的期望和想法,而不仅仅是您认为好的内容。

更新:

首先请评论相关答案。你的回答和你的评论更新没有关系。

好的,至于您的问题编辑,您尝试的内容在 windows-8 中不起作用,因为 PresentationFramework.Aero.dll在 Windows-8 中不存在,这就是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">
...
Run Code Online (Sandbox Code Playgroud)

^^ 我们明确说明了 Aero 主题的程序集。我不使用 Windows-7,所以我不确定这是否是所需要的。但你可以尝试一下。

尝试在 Windows-8 中编译您的代码,以确保它可以在 Windows-8 上正常运行