使用样式触发器更改DockPanel已设置的属性

时间:2014-05-23 21:58:42

标签: wpf triggers dockpanel

我想使用样式触发器根据某些属性(例如标记)更改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

2 个答案:

答案 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>

详细了解Dependency Property Value Precedence

答案 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>

如果这对你有用,请告诉我。 感谢。

相关问题