并非 StackPanel 的所有 DataTriggers 都在工作

Not all DataTriggers of StackPanel are working

我有一个显示文本和图像的按钮: 为此,我使用了一个 StackPanel,里面有一个 TextBlock 和一个 Image。

当变量 "ActiveState" 改变时,StackPanel 的背景也应该改变,为此我使用 DataTriggers

ActiveState=0 -> 红色/ ActiveState=1 -> 蓝色/ ActiveState=2 -> 蓝色闪烁(为此我使用了故事板和彩色动画)

闪烁的触发器 (Value=2) 工作正常,但其他两个触发器 (Value=0 + Value=1) 不工作。

当我删除 Stackpanel 的背景(背景="Transparent")时,前两个触发器正在工作,但最后一个出现以下异常:

'System.InvalidOperationException' 类型的未处理异常发生在 PresentationFramework.dll

其他信息:背景 属性 未指向路径“(0).(1)”中的依赖对象

这是我的代码:

<Button>
  <Button.Template>
    <ControlTemplate TargetType="Button">
        <StackPanel Orientation="Horizontal" Name="SelectButtonStackpanel" Background="Transparent">
            <TextBlock Text="{Binding Text}"/>
            <Image Source="{Binding Image}" Stretch="Uniform" Height="40" Width="40"/>                    
                <StackPanel.Style>
                    <Style TargetType="{x:Type StackPanel}">
                        <Style.Triggers>

                            <DataTrigger Binding="{Binding ActiveState}" Value="0">
                                <Setter Property="Background" Value="Red"/>
                            </DataTrigger>

                            <DataTrigger Binding="{Binding ActiveState}" Value="1">
                                <Setter Property="Background" Value="Blue"/>
                            </DataTrigger>

                            <DataTrigger Binding="{Binding ActiveState}" Value="2">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ColorAnimation 
                                                Storyboard.TargetProperty="(StackPanel.Background).(SolidColorBrush.Color)"
                                                To="Blue" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever"
                                                >
                                            </ColorAnimation>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>

                                <DataTrigger.ExitActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ColorAnimation 
                                                Storyboard.TargetProperty="(StackPanel.Background).(SolidColorBrush.Color)"
                                                Duration="0:0:1"
                                                >
                                            </ColorAnimation>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.ExitActions>
                            </DataTrigger>

                        </Style.Triggers>
                    </Style>
                </StackPanel.Style>
            </StackPanel>
    </ControlTemplate>
  </Button.Template>
</Button>

你知道我是如何让所有三个触发器工作的吗?

此致 菲尔

当您直接在 StackPanel 上设置 Background="Transparent" 时,它的值 precedence 高于从样式 Setter 设置的值。所以删除直接分配并为默认背景添加另一个 Setter。

除此之外,如果您想制作动画 Background.Color,您应该始终明确指定 SolidColorBrushes 而不是像 Background="Red".

这样的预定义画笔
<StackPanel Orientation="Horizontal" Name="SelectButtonStackpanel">
    <StackPanel.Style>
        <Style TargetType="StackPanel">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush Color="Transparent"/>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ActiveState}" Value="0">
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Red"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding ActiveState}" Value="1">
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Blue"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding ActiveState}" Value="2">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation 
                                    Storyboard.TargetProperty="Background.Color"
                                    To="Blue" Duration="0:0:1"
                                    AutoReverse="True" RepeatBehavior="Forever">
                                </ColorAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Style>
</StackPanel>