我对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>

组合框背景属性在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上组合框外观的屏幕截图

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

如果你在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上正常工作

wpf – 未在Windows 8中应用Combobox背景的更多相关文章

  1. HTML5自定义视频播放器源码

    这篇文章主要介绍了HTML5自定义视频播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. HTML5自定义mp3播放器源码

    这篇文章主要介绍了HTML5自定义mp3播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  3. html5自定义video标签的海报与播放按钮功能

    这篇文章主要介绍了html5自定义video标签的海报与播放按钮功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  4. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  5. h5页面背景图很长要有滚动条滑动效果的实现

    这篇文章主要介绍了h5页面背景图很长要有滚动条滑动效果的实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. html5借用repeating-linear-gradient实现一把刻度尺(ruler)

    这篇文章主要介绍了html5借用repeating-linear-gradient实现一把刻度尺,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. 如何在Canvas中添加事件的方法示例

    这篇文章主要介绍了如何在Canvas中添加事件的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. HTML5自定义元素播放焦点图动画的实现

    这篇文章主要介绍了HTML5自定义元素播放焦点图动画的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. 有关HTML5页面在iPhoneX适配问题

    这篇文章主要介绍了有关HTML5页面在iPhoneX适配问题,需要的朋友可以参考下

  10. html5简介及新增功能介绍

    这篇文章主要介绍了html5简介及新增功能介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部