并非所有的StackPanel DataTriggers都在工作

时间:2018-10-12 08:11:45

标签: wpf background storyboard datatrigger stackpanel

我有一个显示文本和图像的按钮: 为此,我将StackPanel与TextBlock和其中的Image一起使用。

当变量“ ActiveState”更改时,StackPanel的背景也应更改,为此,我使用了DataTriggers

ActiveState = 0->红色/ ActiveState = 1->蓝色/ ActiveState = 2->闪烁蓝色(为此,我使用情节提要和彩色动画)

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

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

PresentationFramework.dll中出现了'System.InvalidOperationException'类型的未处理异常

其他信息:Background属性未指向路径'(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>

您是否知道我如何使所有三个触发器正常工作?

最好的问候 菲尔

1 个答案:

答案 0 :(得分:0)

直接在StackPanel上设置Background="Transparent"时,其precedence高于从样式设置器设置的值。因此,请删除直接分配,然后为默认背景添加另一个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>