C# wpf 使用DataTrigger Binding到enum的Storyboard 多段动画,显示出现错误

我希望可以根据一个enum:DoorState 属性的改变来改变界面上的动画,


    public enum DoorState 
    {
        Unknow,
        Close,
        Half_Open,
        Open,
    }

当doorState=open时,door会自当前位置平滑移动到上方;half_open时,door会自当前位置平滑移动到中间;close时,door 会自当前位置平滑移动到下方

img

但是我在使用以下代码实现功能时,发现有些状态变化会导致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>

使用这个方案基本解决了问题
https://blog.csdn.net/openzpc/article/details/50588063