首页 > 其他分享 >WPF 在MVVM模式下应用动画

WPF 在MVVM模式下应用动画

时间:2023-07-05 18:23:11浏览次数:42  
标签:动画 string MVVM TextBlock WPF public 属性

一个简单的需求:当程序发生异常时候,在界面上动画显示异常信息。

这个需求看似简单,只需要try……catch到异常,然后把异常的信息写入界面就OK了。

但在MVVM时,就不是这么简单了。MVVM模式下,追求前后端的分离。然后catch到的异常,也只能在后台代码中。如果传递到前台呢?

这自然就想到了Binding。在ViewModel中定义一个属性接收异常信息。然后在xaml中去绑定这个属性,就可以显示它了。

如下代码所示:

  C#:

  Xaml:

<TextBlock Text="{Binding Exception}"/>

C#代码:
/// <summary> /// 数据类 /// </summary> public class BTN:NotifyObject { public string Exception { get => exception; set { exception = value; OnPropertyChanged(); } } string exception = string.Empty; }
  

如此一来,只需要给Exception属性赋值,TextBlock就能显示了。

OK,基本需求搞定。当如何使用动画呢?

 

首先,实现这种动画有三种方式:

  1. 改变TextBlock的Visibility属性,从Hidden 到 Visible。这中方式会用到KeyFrameAnimation。

  2. 改变TextBlock的Height属性,从0 到40(或者30),它就会有个“长高”的过程。

  3. 改变TextBlock的Opacity属性,从0到1,它就会有个慢慢显现的过程。

这里推荐使用第2或者第3中。因为它们使用的都是DoubleAnimation对象,比第一种使用KeyFrameAnimation对象要简单许多。

 

其次,如何触发动画呢?

在传统的编程模式下,只要在给Exception属性赋值时,控制TextBlock去显示动画就搞定了。但现在实在MVVM模式下!后台拿不到前台元素!

此时,触发器就发挥作用了。即,当某一个属性的值为特定值时,执行某些动作。

如果使用TextBlock的Text属性作为触发器,在Xaml中Value值不好写(因为在Xaml中,唯一能确定的string类型的值是Null或者String.Empty)。

因此这里可以为TextBlock添加一个附件属性,让它去绑定一个值。当这个属性的值满足条件的时候,就触发动画。

看代码吧:

   /// <summary>
    /// 数据类
    /// </summary>
    public class BTN:NotifyObject
    {

        public string Exception
        {
            get => exception;
            set
            {
                exception = value;
                OnPropertyChanged();

                HasException = !string.IsNullOrWhiteSpace(value);
            }
        }
        string exception = string.Empty;

        // 添加HasException属性,用于前台附加属性的绑定
        public bool HasException
        {
            get=>hasException;
            set
            {
                hasException = value;
                OnPropertyChanged();
            }
        }
        bool hasException = false;
    }

 

  
  public class NotifyUI {
     // 定义附加属性,用于控件去绑定后台属性 private static readonly DependencyProperty HasMessageProperty = DependencyProperty.RegisterAttached( "HasMessage", typeof(bool),typeof(NotifyUI),new PropertyMetadata(false)); public static void SetHasMessage(DependencyObject element, bool value) => element.SetValue(HasMessageProperty, value); public static bool GetHasMessage(DependencyObject element) => (bool)element.GetValue(HasMessageProperty); }
        <TextBlock VerticalAlignment="Bottom" 
                   Background="Yellow"
                   Height="0"
                   Text="{Binding Exception}"
                   local:NotifyUI.HasMessage="{Binding HasException}">  <!-- 使用附加属性去绑定后台的HasException属性 -->
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
              <!-- 设置触发器。当附加属性的值为True时,开始动画 --> <Trigger Property="local:NotifyUI.HasMessage" Value="True"> <Trigger.EnterActions> <BeginStoryboard> <Storyboard>
                        <!-- 希望动画播放完毕后的,暂定一段时间,然后自动消退。这里不使用AutoReverse = True,因为在消退前不会暂定。--> <DoubleAnimation To="40" Duration="0:0:0.2" Storyboard.TargetProperty="Height"> <DoubleAnimation.EasingFunction> <BounceEase EasingMode="EaseIn"/> </DoubleAnimation.EasingFunction> </DoubleAnimation>

                        <!-- 设置BeignTime,是在第一个动画播放完之后,与第二个动画开始播放之间有时间间隔 --> <DoubleAnimation To="0" Duration="0:0:0.2" Storyboard.TargetProperty="Height" BeginTime="0:0:1.2"> <DoubleAnimation.EasingFunction> <BounceEase EasingMode="EaseOut"/> </DoubleAnimation.EasingFunction> </DoubleAnimation> </Storyboard> </BeginStoryboard> </Trigger.EnterActions> </Trigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock>

 如此,就通过两个属性,在MVVM模式下,完成了动画的触发。

 

标签:动画,string,MVVM,TextBlock,WPF,public,属性
From: https://www.cnblogs.com/raynado/p/17529478.html

相关文章

  • WPF Window 窗口 常用属性
    window窗口属性属性定义属性值注解 WindowStartupLocation 获取或设置窗口首次显示时的位置。 一个 WindowStartupLocation 值,指定窗口首次显示时的顶边/左边位置。默认值为 Manual。 将 WindowStartupLocation 属性设置为 Manual 使窗口按......
  • AE脚本丨自适应底栏边框文字标题动画 Box It v1.0&使用教程
    这个AE脚本BoxIt主要是用于快速创建复杂的动态文本框,非常适合下第三标题、标签、聊天气泡、多个文本框等。 去下载它的主要特点有:1.简单易用,无需键入任何代码,通过简单的拖放和调整参数即可创建动态文本框2.包含多种预设选项,如简单、标准、粗体、标签、聊天气泡等......
  • wpf小说阅读器 ----wpf练习demo
    1.登录窗口布局<Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinitionWidth="2*"/></Grid.ColumnDefinitions><Border><Border.Backgro......
  • WPF 使用border绘制出只显示四个直角的效果
    前段时间为项目做了个人脸识别登录的功能,但无奈本人功底有限(样式没有那么让老板满意),最后请了个UI工程师重新设计了一份。UI设计的效果开发再去实现的过程(懂的都懂),最后居然卡在了一个直角边框上。搜寻了很多资料居然没有着相关的样式,这个也是踩坑了挺久。这里奉上结果的代码<Bord......
  • DevExpress WPF Scheduler组件,快速构建性能优异的调度管理器!(下)
    在上文中(点击这里回顾>>),我们介绍了DevExpressWPFScheduler组件中的日历视图、时间轴视图等,在本文中我们将继续带大家了解Scheduler组件的UI/UX自定义等其他功能。DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能......
  • vue 基于 CountUp.js,可用于创建显示数字数据的动画。
    地址:https://github.com/xlsdg/vue-countup-v2Installation$npminstall--savecountup.jsvue-countup-v2Usage<template><divclass="iCountUp"><ICountUp:delay="delay":endVal="endVal"......
  • WPF处理未捕获异常和程序退出事件
    Application和AppDomain都有Exit事件,程序正常退出,会依次调用Application的Exit事件和Appdomain的Exit事件。如果是因为未捕获的异常导致程序退出,则不会调用任何Exit事件。Appdomain的Exit事件不要再出现UI元素,如弹窗之类的,会导致异常。AppDomain.UnhandledException会捕获所有T......
  • wpf 资源字典 换肤
    介绍一下wpf中给控件更改样式的集中方法,只用button演示,其他控件相同1.使用代码更改button的style定义button的style1<StyleTargetType="Button"x:Key="buttonstyle1"><SetterProperty="Background"Value="LightBlue"/>&l......
  • WPF复习知识点记录
    WPF复习知识点记录由于近几年主要在做Web项目,客户端的项目主要是以维护为主,感觉对于基础知识的掌握没有那么牢靠,趁着这个周末重新复习下WPF的相关知识。文章内容主要来自大佬刘铁锰老师的经典著作《深入浅出WPF》。因为是复习,所以知识内容不会一一记录,如有需要了解更多可以看书......
  • 用Wpf做一个Block编程画板(续5-Diagram画板,仿Scratch)
    用Wpf做一个Block编程画板(续5-Diagram画板)先上一张效果动图,本次更新主要仿照Scratch,目前仅完成拖拽部分,逻辑部分后续完善。同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram本次扩展主要内容:1.Block模块,入口在文件新建下。2.简易Block的使用:......