gpt4 book ai didi

wpf - 如何扩展而不是覆盖WPF样式

转载 作者:行者123 更新时间:2023-12-03 10:25:35 26 4
gpt4 key购买 nike

我想在我的应用程序中使用自定义主题,据我所知,我可以通过使用资源字典并在App.xaml中引用它来完成此任务。样式将覆盖默认值,如下所示:

<Style TargetType="{x:Type Label">
<Setter Property="Foreground" Value="Green" />
</Style>

现在,我猜默认的标签样式将被相同的值覆盖,但我所有的标签字体均为绿色。当我想在某个地方重新设置标签样式时,问题就开始了。当我想像这样更改网格中的其他属性时
<Grid.Resources>
<Style TargetType="{x:Type Label">
<Setter Property="FontSize" Value="28" />
</Style>
</Grid.Resources>

网格中的所有标签都失去了前景色,并再次具有默认值(我不是在上一步中覆盖默认值吗?)。经过一番尝试,我发现要正确执行此操作,我必须在 Style声明 BasedOn={StaticResource {x:Type Label}}"中添加另一个属性,并且它可以工作。这对我来说很奇怪,因为现在我将不得不在整个应用程序中重复相同的BasedOn代码,而这不是样式设计的工作方式-应该自动完成!例如在HTML + CSS样式中继承和合并样式,在WPF中将它们替换...

请注意,当我不使用任何样式控件时,仍然会从某种程度上获得它们的外观(系统主题?)。我如何告诉他们在其他地方查找默认值,因此在样式上没有任何其他代码的情况下,他们会认为默认情况下应为绿色?

有什么方法可以自动设置BasedOn属性?也许有更好的方法来整体上做到这一点?

最佳答案

我有同样的问题。我使用了Zack的答案并对其进行了改进,如下所示,因此,如果您不指定样式,则仍会考虑覆盖的默认值。基本上,这就是您要做的,但是在ResourceDictionary中只是一次。

<Window x:Class="TestWpf.RandomStuffWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Random Stuff Window">
<Window.Resources>
<ResourceDictionary>
<!-- Default Label style definition -->
<Style TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="Green" />
</Style>
<!-- Extending default style -->
<Style TargetType="{x:Type Label}"
x:Key="LargeGreenForegroundLabel"
BasedOn="{StaticResource {x:Type Label}}">
<Setter Property="FontSize" Value="28" />
</Style>
</ResourceDictionary>
</Window.Resources>
<StackPanel>
<Button Click="Button_Click">Click</Button>
<Label Content="GreenForegroundLabel" /> <!-- Uses default style -->
<Label Style="{StaticResource LargeGreenForegroundLabel}"
Content="LargeGreenForegroundLabel" />
</StackPanel>
</Window>

关于wpf - 如何扩展而不是覆盖WPF样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576589/

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