我想使用样式触发器根据某些属性(例如标记)更改dockpanel的外观。这是我的代码:
<DockPanel Grid.Row="0" LastChildFill="True"
Name="MyDockPanel"
Tag="{Binding TagForColor}"
Background="Blue"
Width="300">
<DockPanel.Resources>
<Style TargetType="{x:Type DockPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="Alert">
<Setter Property="DockPanel.Background" Value="Red"/>
<Setter Property="DockPanel.Width" Value="100"/>
<Setter Property="TextBlock.FontSize" Value="30"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DockPanel.Resources>
<TextBlock Text="My Text"
DockPanel.Dock="Top"
Name="MyText"
Foreground="White">
</TextBlock>
一旦设置的背景和宽度等属性不会被触发器更新。我确认触发器被触发,因为我的文本块的大小确实增加了。
有人能告诉我这种行为背后的原因吗?
谢谢, RDV
答案 0 :(得分:1)
您需要将Background
的默认值移动到Style
作为Setter
,否则Trigger
无法覆盖手动设置的值(它有更高的优先级)。 Width
存在同样的问题。此外,与您的问题无关,但您可以使用DataTrigger
Trigger
<DockPanel Grid.Row="0" LastChildFill="True" Name="MyDockPanel" Tag="{Binding TagForColor}">
<DockPanel.Resources>
<Style TargetType="{x:Type DockPanel}">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Width" Value="300"/>
<Style.Triggers>
<Trigger Property="Tag" Value="Alert">
<Setter Property="Background" Value="Red"/>
<Setter Property="Width" Value="100"/>
<Setter Property="TextBlock.FontSize" Value="30"/>
</Trigger>
</Style.Triggers>
</Style>
</DockPanel.Resources>
<TextBlock Text="My Text" DockPanel.Dock="Top" Name="MyText" Foreground="White"/>
</DockPanel>
答案 1 :(得分:0)
你需要在Style中移动背景和宽度。如果你想为Background和Width属性分配一些默认值,你应该在setter的style中设置它们。所以每当 你的触发器触发,控件将从触发器获取值。这是wpf的属性值继承。这是链接:http://wpftutorial.net/DependencyProperties.html#valueres。
此代码适用于您:
<DockPanel Grid.Row="0" LastChildFill="True"
Name="MyDockPanel"
Tag="{Binding TagForColor}"
>
<DockPanel.Resources>
<Style TargetType="{x:Type DockPanel}">
<Setter Property="Background" Value="Blue"></Setter>
<Setter Property="Width" Value="300"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="Alert">
<Setter Property="DockPanel.Background" Value="Red"/>
<Setter Property="DockPanel.Width" Value="100"/>
<Setter Property="TextBlock.FontSize" Value="30"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DockPanel.Resources>
<TextBlock Text="My Text"
DockPanel.Dock="Top"
Name="MyText"
Foreground="White">
</TextBlock>
</DockPanel>
如果这对你有用,请告诉我。 感谢。