我有一个ListBox,我想在其中显示当前状态,并将Rectangle
滑出。
当项目为Selected
或 MouseOver
时,Recangle
应该延长,否则会缩小。
<ControlTemplate.Resources>
<Storyboard x:Key="MoveOutStoryboard">
<DoubleAnimation To="175"
Storyboard.TargetProperty="Width"
Storyboard.TargetName="AnimatingGrid">
<DoubleAnimation.EasingFunction>
<QuinticEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
<ColorAnimation Storyboard.TargetName="ContentPresenter"
Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
To="White" />
</Storyboard>
<Storyboard x:Key="MoveInStoryboard">
<DoubleAnimation To="16"
Storyboard.TargetProperty="Width"
Storyboard.TargetName="AnimatingGrid">
<DoubleAnimation.EasingFunction>
<QuinticEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
<ColorAnimation Storyboard.TargetName="ContentPresenter"
Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
To="Black" />
</Storyboard>
</ControlTemplate.Resources>
因为没有&#39;或&#39; Multitrigger我想出了以下Trigger:
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="False" />
<Condition Property="IsSelected" Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MoveInStoryboard}" />
</MultiTrigger.EnterActions>
</MultiTrigger>
</ControlTemplate.Triggers>
但不知怎的,当我有最后一个MoveOutStoryboard
集时,MultiTrigger
永远不会被调用,但我无法弄明白为什么。
感谢您的帮助。
答案 0 :(得分:1)
因为除非由相同的触发器启动,否则另一个动画无法控制属性,因此请尝试尝试
<Trigger Property="IsMouseOver"
Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource MoveInStoryboard}" />
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource MoveInStoryboard}" />
</Trigger.ExitActions>
</Trigger>
如果您遇到鼠标悬停和IsSelected的问题,请使用此
<Trigger Property="IsMouseOver"
Value="True">
<Trigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="moveIn2" />
<RemoveStoryboard BeginStoryboardName="moveOut2" />
<BeginStoryboard x:Name="moveOut1"
Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="moveIn2" />
<RemoveStoryboard BeginStoryboardName="moveOut2" />
<BeginStoryboard x:Name="moveIn1"
Storyboard="{StaticResource MoveInStoryboard}" />
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Trigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="moveIn1" />
<RemoveStoryboard BeginStoryboardName="moveOut1" />
<BeginStoryboard x:Name="moveOut2"
Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="moveIn1" />
<RemoveStoryboard BeginStoryboardName="moveOut1" />
<BeginStoryboard x:Name="moveIn2"
Storyboard="{StaticResource MoveInStoryboard}" />
</Trigger.ExitActions>
</Trigger>
也可以删除可能没有必要的多重触发器,或者您可以将删除故事板方法与您的方法相结合,这也应该有效。
修改强>
这是你使用RemoveStoryboard的方法,这是有效的,我也测试了
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Trigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="multi" />
<RemoveStoryboard BeginStoryboardName="sel" />
<BeginStoryboard x:Name="over"
Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Trigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="multi" />
<RemoveStoryboard BeginStoryboardName="over" />
<BeginStoryboard x:Name="sel"
Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver"
Value="False" />
<Condition Property="IsSelected"
Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="sel" />
<RemoveStoryboard BeginStoryboardName="over" />
<BeginStoryboard x:Name="multi"
Storyboard="{StaticResource MoveInStoryboard}" />
</MultiTrigger.EnterActions>
</MultiTrigger>
</ControlTemplate.Triggers>
或者这个,但这可能是错误的,你可以在动画中看到一些快照
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="over"
Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="over" />
</Trigger.ExitActions>
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="sel"
Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="sel" />
</Trigger.ExitActions>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver"
Value="False" />
<Condition Property="IsSelected"
Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard x:Name="multi"
Storyboard="{StaticResource MoveInStoryboard}" />
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="multi" />
</MultiTrigger.ExitActions>
</MultiTrigger>
</ControlTemplate.Triggers>
答案 1 :(得分:1)
因此经过多次尝试并在pushpraj的帮助下,我得到了最终的解决方案。也许它会帮助任何有同样问题的人:
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver"
Value="True" />
<Condition Property="IsSelected"
Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="moveIn1" />
<RemoveStoryboard BeginStoryboardName="moveOut2" />
<BeginStoryboard x:Name="moveOut1"
Storyboard="{StaticResource MoveOutStoryboard}" />
</MultiTrigger.EnterActions>
</MultiTrigger>
<Trigger Property="IsSelected"
Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="moveOut2"
Storyboard="{StaticResource MoveOutStoryboard}" />
</Trigger.EnterActions>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver"
Value="False" />
<Condition Property="IsSelected"
Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="moveOut2" />
<BeginStoryboard x:Name="moveIn1"
Storyboard="{StaticResource MoveInStoryboard}" />
</MultiTrigger.EnterActions>
</MultiTrigger>