gpt4 book ai didi

wpf - 从 DataTrigger 内部更改样式

转载 作者:行者123 更新时间:2023-12-04 19:46:33 24 4
gpt4 key购买 nike

正如 WPF 经常发生的那样,我可能会以错误的方式处理事情,但我有以下情况:

我想根据 DataTrigger 应用样式,但您不能从样式内部更改样式:

<Button>
<Button.Style>
<Style BasedOn="SomeStyle">
<Style.Triggers>
<DataTrigger ...>
<Setter Property="Style" Value="OtherStyle" /> <---- NO CAN DO

确实合乎逻辑,但我要避免的是重复相同的 setter ,只是因为我的触发条件发生了变化:
<Button>
<Button.Style>
<Style BasedOn="SomeStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding X}" Value="Condition1">
<Setter Property="A" Value="1" />
<Setter Property="B" Value="1" />
<etc...>
(...)

<Button>
<Button.Style>
<Style BasedOn="SomeStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding X}" Value="Condition2">
<Setter Property="A" Value="1" />
<Setter Property="B" Value="1" />
<etc...>

是否还有其他东西可以放入 DataTrigger,从而允许我从其中更改样式?或者另一种方式:避免重复样式信息?

最佳答案

以下是如何根据数据触发器更改元素样式的示例:

<StackPanel>
<Control Focusable="False">
<Control.Template>
<ControlTemplate>
<!--resources-->
<ControlTemplate.Resources>
<Style TargetType="Button" x:Key="primary">
<Setter Property="Content" Value="Primary style"/>
</Style>
<Style TargetType="Button" x:Key="secondary">
<Setter Property="Content" Value="Secondary style"/>
</Style>
</ControlTemplate.Resources>
<!--content-->
<Button Style="{StaticResource primary}" x:Name="button"/>
<!--triggers-->
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="true">
<Setter TargetName="button" Property="Style" Value="{StaticResource secondary}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsKeyboardFocusWithin,RelativeSource={RelativeSource Self}}" Value="true">
<Setter TargetName="button" Property="Style" Value="{StaticResource secondary}"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Control.Template>
</Control>
<Button Content="A normal button"/>
</StackPanel>
在本例中, Control是一个包装元素,它将在其控制模板中承载所需的元素。如果您希望通过名称访问它,则必须在控制模板中。在控件模板的触发器中定义了一组数据触发器,它将根据需要将样式应用于所需的元素(按钮)。
我没有找到避免重复 setter 的方法。也许交换/应用样式的能力可以帮助您获得相同的结果。
如果您不想使用控制模板方法,您可以使用附加属性或未使用的 Tag元素中的属性。在此示例中,我们将利用两种方式绑定(bind)来实现相同的结果。
例子:
<StackPanel>
<Grid>
<!--content-->
<Button Style="{Binding Tag,RelativeSource={RelativeSource FindAncestor,AncestorType=Grid}}"/>
<Grid.Style>
<Style TargetType="Grid">
<!--resources-->
<Style.Resources>
<Style TargetType="Button" x:Key="primary">
<Setter Property="Content" Value="Primary style"/>
</Style>
<Style TargetType="Button" x:Key="secondary">
<Setter Property="Content" Value="Secondary style"/>
</Style>
</Style.Resources>
<Setter Property="Tag" Value="{StaticResource primary}"/>
<!--triggers-->
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="true">
<Setter Property="Tag" Value="{StaticResource secondary}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsKeyboardFocusWithin,RelativeSource={RelativeSource Self}}" Value="true">
<Setter Property="Tag" Value="{StaticResource secondary}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
<Button Content="A normal button"/>
</StackPanel>
尝试一下,看看这是否可以帮助您达到预期的结果。

关于wpf - 从 DataTrigger 内部更改样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758592/

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