WPF XAML Trigger中使用动画后 动画对象冻结的处理办法

2021-03-07 04:26

阅读:293

标签:att   部分   bsp   tps   class   seo   new   方法   ada   

原文:WPF XAML Trigger中使用动画后 动画对象冻结的处理办法

在编写XAML时

在Trigger中使用动画,在动画之后,动画对象就会被冻结,无法被其他动画或者属性改变。

处理办法有:

1 使用附加属性来添加动画

技术图片
        public static readonly DependencyProperty AniInvokePropery = DependencyProperty.RegisterAttached("AniInvoke", typeof(Storyboard), typeof(ATCH), new PropertyMetadata(null, AniInvokeCallBack));

        public static void SetAniInvoke(DependencyObject d, Storyboard value) => d.SetValue(AniInvokePropery, value);

        public static Storyboard GetAniInvoke(DependencyObject d) => (Storyboard)d.GetValue(AniInvokePropery);

        private static void AniInvokeCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var t = d as FrameworkElement;

            var s = (Storyboard)e.NewValue;

            if (s != null)
                t.BeginStoryboard(s);
        }
技术图片

xaml

技术图片
 
技术图片

 

 

技术图片

如果是想要搭配trigger来使用则是需要:

技术图片
        
技术图片

 

 

 

2 依赖属性来增加动画

依赖属性相对附加属性而言,在MVVM模式也是非常的引用

技术图片
     public static readonly DependencyProperty AniInvokeProperty= DependencyProperty.Register("AniInvoke", typeof(Storyboard), typeof(SearchViewPage), new PropertyMetadata(null, AniInvokeCallBack));

       
        private static void AniInvokeCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var b = d as SearchViewPage;
            var s = (Storyboard)e.NewValue;
            if(s!=null)
            b.BeginStoryboard(s);
        }
技术图片

 

xaml( 涉及其他代码,只是截取部分,这个部分是style的trigger)

技术图片
             "{Binding ElementName=SearchBox,Path=Tag}" Value="false">
                                "Tag" Value="T1"/>
                                "AniInvoke">
                                    "220" To="440" Duration="0:0:00.5" Storyboard.TargetProperty="Width"/>
                                        "{Binding ElementName=SearchBox,Path=Tag}" Value="true">
                                "Tag" Value="T2"/>
                                "AniInvoke">
                                    "440" To="220" Duration="0:0:00.5" Storyboard.TargetProperty="Width"/>
                                        
技术图片

 

 

 

 

技术图片

 

 

3使用storybroad的FillBehavior

FillBehavior有两个值一个是Stop和HoldEnd

HoldEnd是默认值,也就是维持动画结束后的状态

Stop则是取消动画后的状态

启用stop后 在其他地方设置width时是可以改变的,具体看依赖属性的优先级

技术图片
   
技术图片

 

 

 

4通过情节动画的StopStoryboard来停止动画

这个则是需要使用其他的触发器配合或者是使用EnterActions和ExitActions的方式

EnterActions是触发器活跃时启动的方法,也就是触发器触发时

ExitActions是触发器不活跃时启动,注意不活跃是本触发器活跃后或者触发条件为相反时

(1)其他触发器配合:

技术图片
 
        "20"  Margin="46,292,171,57">
            点击状态:"{Binding ElementName=btn1, Path=IsPressed,Mode=OneWay}">
技术图片

注意鼠标要在触发区域内

技术图片

 

(2)通过EnterAction和ExitAction

技术图片

        "20"  Margin="46,292,171,57">
            点击状态:"{Binding ElementName=btn1, Path=IsPressed,Mode=OneWay}">
技术图片

技术图片

WPF XAML Trigger中使用动画后 动画对象冻结的处理办法

标签:att   部分   bsp   tps   class   seo   new   方法   ada   

原文地址:https://www.cnblogs.com/lonelyxmas/p/12833968.html


评论


亲,登录后才可以留言!