我希望可以根据一个enum:DoorState 属性的改变来改变界面上的动画,
public enum DoorState
{
Unknow,
Close,
Half_Open,
Open,
}
当doorState=open时,door会自当前位置平滑移动到上方;half_open时,door会自当前位置平滑移动到中间;close时,door 会自当前位置平滑移动到下方
但是我在使用以下代码实现功能时,发现有些状态变化会导致Rectange对象恢复到最原始的位置再移动到目标位置,如:从half_open 到close,并且三个DataTrigger 的上下位置改变会导致错误现象发生条件的改变,如:close到open。
想请问怎么才能仅依靠xaml文件实现这样的动画?
如果需要借助cs文件,又该怎么实现?
<Rectangle x:Name="door" Height="100" Width="20" Stroke="Black" Fill="LightGray" VerticalAlignment="Top" HorizontalAlignment="Left">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Setter Property="Margin" Value="315,150,0,0"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataContext.DoorState,RelativeSource={RelativeSource Self}}"
Value="{x:Static DataClass:DoorState.Close}">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="CloseDoor">
<Storyboard FillBehavior="HoldEnd">
<ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="Margin">
<SplineThicknessKeyFrame KeyTime="00:00:00.5" Value="315,210,0,0"/>
</ThicknessAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="CloseDoor"></RemoveStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataContext.DoorState,RelativeSource={RelativeSource Self}}"
Value="{x:Static DataClass:DoorState.Half_Open}">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="Half_OpenDoor">
<Storyboard FillBehavior="HoldEnd">
<ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="Margin">
<SplineThicknessKeyFrame KeyTime="00:00:00.5" Value="315,170,0,0"/>
</ThicknessAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="Half_OpenDoor"></RemoveStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataContext.DoorState,RelativeSource={RelativeSource Self}}"
Value="{x:Static DataClass:DoorState.Open}">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="OpenDoor">
<Storyboard FillBehavior="HoldEnd">
<ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="Margin">
<SplineThicknessKeyFrame KeyTime="00:00:00.5" Value="315,150,0,0"/>
</ThicknessAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="OpenDoor"></RemoveStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>