代码之家  ›  专栏  ›  技术社区  ›  eflorico

一个属性上有多个故事板

  •  8
  • eflorico  · 技术社区  · 16 年前

    我有多个故事板可以访问同一个属性(而不是同时访问)。在一个故事板更改了属性之后,另一个故事板似乎无法访问它,并且没有更改任何内容。我该怎么办?

    Sample:

    <ListBox>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3">
                                <ContentPresenter />
                                <Border.Background>
                                    <SolidColorBrush />
                                </Border.Background>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Trigger.EnterActions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="#3e8bff" Duration="0:0:0.1" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </Trigger.EnterActions>
                                    <Trigger.ExitActions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </Trigger.ExitActions>
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsMouseOver" Value="True" />
                                        <Condition Property="IsSelected" Value="False" />
                                    </MultiTrigger.Conditions>
                                    <MultiTrigger.EnterActions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </MultiTrigger.EnterActions>
                                    <MultiTrigger.ExitActions>
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </MultiTrigger.ExitActions>
                                </MultiTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.Items>
            <sys:String>hey</sys:String>
            <sys:String>du</sys:String>
            <sys:String>dux</sys:String>
            <sys:String>duy</sys:String>
            <sys:String>dua</sys:String>
        </ListBox.Items>
    </ListBox>
    

    这是我能做的最小的示例代码。悬停一个项目后,它在被选中时不会变为蓝色(尝试单击一个项目,然后使用箭头键选择项目而不悬停它们)。

    2 回复  |  直到 7 年前
        1
  •  13
  •   Deleted    7 年前

    我有解决办法!!!触发和动作顺序很重要…答案是不要在同一时间播放多于一个故事板,只需停止另一个。

    <ControlTemplate.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsMouseOver" Value="True"/>
                <Condition Property="Selector.IsSelected" Value="False" />
            </MultiTrigger.Conditions>
            <MultiTrigger.EnterActions>
                <StopStoryboard BeginStoryboardName="SelectedBegin" />
                <StopStoryboard BeginStoryboardName="UnselectBegin" />
                <BeginStoryboard x:Name="EnterBegin" Storyboard="{StaticResource MouseEnterSb}"/>
            </MultiTrigger.EnterActions>
            <MultiTrigger.ExitActions>
                <BeginStoryboard x:Name="LeaveBegin" Storyboard="{StaticResource MouseLeaveSb}"/>
            </MultiTrigger.ExitActions>
        </MultiTrigger>
        <Trigger Property="Selector.IsSelected" Value="True">
            <Trigger.EnterActions>
                <StopStoryboard BeginStoryboardName="LeaveBegin" />
                <StopStoryboard BeginStoryboardName="EnterBegin" />
                <BeginStoryboard x:Name="SelectedBegin" Storyboard="{StaticResource SelectedSb}"/>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard x:Name="UnselectBegin" Storyboard="{StaticResource UnselectSb}"/>
            </Trigger.ExitActions>
        </Trigger>
    </ControlTemplate.Triggers> 
    
        2
  •  1
  •   Mark Carpenter    16 年前

    我已经能够用以下代码重现您的错误结果(我也感到困惑):

    <ListBox>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <ControlTemplate.Resources>
                            <Storyboard x:Key="BorderAnimationToRed">
                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.1" />
                            </Storyboard>
                            <Storyboard x:Key="BorderAnimationToBlue">
                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Blue" Duration="0:0:0.1" />
                            </Storyboard>
                            <Storyboard x:Key="BorderAnimationToOrange">
                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" />
                            </Storyboard>
                            <Storyboard x:Key="BorderAnimationToWhite">
                                <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" />
                            </Storyboard>
                        </ControlTemplate.Resources>
                        <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3">
                            <ContentPresenter />
                            <Border.Background>
                                <SolidColorBrush />
                            </Border.Background>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Trigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource BorderAnimationToOrange}"/>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/>
                                </Trigger.ExitActions>
                            </Trigger>
                            <Trigger Property="IsSelected" Value="True">
                                <Trigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource BorderAnimationToBlue}"/>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/>
                                </Trigger.ExitActions>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.Items>
        <sys:String>hey</sys:String>
        <sys:String>du</sys:String>
        <sys:String>dux</sys:String>
        <sys:String>duy</sys:String>
        <sys:String>dua</sys:String>
    </ListBox.Items>
    

    由于视觉、资源和触发器是单独声明的,因此此代码更易于阅读。也许您可以尝试使用EventTriggers来实现您的目标(使用“listBoxItem.mouseEnter”和“listBoxItem.mouseLeave”路由事件)。祝你好运!