gpt4 book ai didi

wpf - 组合框背景未在 Windows 8 中应用

转载 作者:行者123 更新时间:2023-12-04 08:26:37 24 4
gpt4 key购买 nike

我对 wpf 主题有点困惑。我想让 wpf 屏幕在 Vista、Windows 7 和 Windows 8 上看起来相同。所以我已经相应地设置了组件的样式,除了在 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 中没有效果,我得到的只是一个带有右侧箭头的扁平矩形(默认的 Windows 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 主题)添加一个条目,如上面代码中所列?

我知道我的问题有点含糊,但相信我,我真的对不同 Windows 版本上 wpf 的默认主题感到困惑。

编辑:
我仍然无法根据我的需要设置组合框的样式。组合框仍然看起来像一个灰色矩形。

这是我所做的。我从微软的网站下载了 Aero.NormalColor.xaml 并包含在应用程序的主题文件夹中。然后我在 App.xaml 中添加了以下内容
    <ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Themes/Aero.NormalColor.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

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

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

编辑-2
Windows 8 上组合框外观的屏幕截图
enter image description here

最佳答案

ComboBox可点击区域实际上是一个 ToggleButton
如果你看看 Style为此ToggleButton在 Windows-8 中,您会看到类似以下内容:

<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} .这就是为什么当您设置 Background 时看不到任何效果的原因。 Windows-8 中的属性 ComboBox
如果您想携带 Style跨不同的操作系统版本(无需回溯并不断检查新版本是否搞砸了您的覆盖),简单的规则是 创建 它自己。

创建一个 Style并将其设置为由 TargetType 应用并且没有 Key自动应用。这样在任何操作系统中都是您的 Style被使用而不是默认的底层。

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

附注 :

从可用性 POV 为用户提供 Windows-7 ComboBox在 Windows-8 上运行的应用程序不是很好(除非你的整个应用程序看起来像一个更糟糕的 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">
...

^^ 我们明确说明了 Aero Theme 的程序集。我不使用 Windows-7,所以我不确定这是否就足够了。但你可以试一试。

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

关于wpf - 组合框背景未在 Windows 8 中应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16183746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com