vegetable man 2023-06-07 10:54
浏览 23
已结题

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>
  • 写回答

1条回答 默认 最新

  • vegetable man 2023-06-12 10:57
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 修改了问题 6月7日
  • 创建了问题 6月7日

悬赏问题

  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?
  • ¥15 cups交叉编译后移植到tina sdk的t113,只需要实现usb驱动打印机,打印pdf文件
  • ¥30 关于#wireshark#的问题:需要网络应用流量数据集需要做长度序列的实验,需要与应用产生的会话的数据包的长度,如视频类或者聊天类软件
  • ¥15 根据上述描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化(标签-matlab|关键词-流计算)