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

这个需求看似简单,只需要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模式下,完成了动画的触发。

WPF 在MVVM模式下应用动画的更多相关文章

  1. 笔记03 wpf 在MVVM模式下怎样在Viewmodel里面获得view的控件对象

     转自http://blog.csdn.net/qing2005/article/details/6601199http://blog.csdn.net/qing2005/article/detail ...

  2. WPF中MVVM模式下控件自有的事件绑定

    1.原因 在WPF中单纯的命令绑定往往不能满足覆盖所有的事件,例如ComboBox的SelectionChanged事件,DataGrid的SelectionChanged事件等等,这时就可以用事件绑 ...

  3. WPF:MVVM模式下ViewModel关闭View

    不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnabl ...

  4. WPF 在MVVM模式下弹出子窗体的方式

    主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来 ...

  5. WPF:MVVM模式下ViewModel调用View

    两种基本方法: 消息通知和参数传递 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnableCha ...

  6. WPF中在MVVM模式下,后台绑定ListCollectionView事件触发问题

    问题:WPF中MVVM模式下 ListView绑定ListCollectionView时,CurrentChanged无法触发 解决方案: 初期方案:利用ListView的SelectionChang ...

  7. WPF实战案例-MVVM模式下在Xaml中弹出窗体

    相信很多学习和开发wpf项目的同学都了解过mvvm模式,同样,在mvvm模式下会有一个不可忽视的问题,就是怎么在xaml中弹出窗体,而不破坏MVVM本身的结构. 关于弹出窗体的方式还是很多的,本文先讲 ...

  8. MVVM模式下WPF动态绑定展示图片

    MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...

  9. wpf mvvm模式下CommandParameter传递多参

    原文:wpf mvvm模式下CommandParameter传递多参 CommandParameter一般只允许设置一次,所以如果要传递多参数,就要稍微处理一下.我暂时还没找到更好的方案,下面介绍的这 ...

  10. WPF MVVM模式下ComboBox级联效果 选择第一项

    MVVM模式下做的省市区的级联效果.通过改变ComboBox执行命令改变市,区. 解决主要问题就是默认选中第一项 1.首先要定义一个属性,继承自INotifyPropertyChanged接口.我这里 ...

随机推荐

  1. Updates were rejected because the tip of your current branch is behind

    最近本地一个flutter项目因为当时使用可视化创建的时候出了一些问题,但是起初没有注意,后来因为需要新增一个语音插件,需要修改原生android MainActivity.java,才发现这个目录根 ...

  2. Galaxy 生信平台(四):邮件与管理员配置

    前几天看到中山大学和国家基因库合作开发的 Translatome Workbench 翻译组学可视化在线数据分析平台 (db.cngb.org/galaxy/) 的推送信息,也上去看了一下,工具和教程 ...

  3. element-ui中Select 选择器异步加载下一页

    场景 当我们使用 Select 选择器存放大量数据的时候. 会发现存在这么2个问题. 1.接口响应时间较长.(因为数据量较多,一次查询的所有)甚至有可能超时. 2.前端下拉框滑动卡顿. 这个时候们如何 ...

  4. [Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args

    0 序言 一次没搞懂,处处受影响.这个问题属于基础问题,但又经常踩坑,不得不重视一下了. 1 Java程序动态参数的配置途径:系统变量与JVM参数(VM Option) vs 环境变量 vs 启动程序 ...

  5. CANoe学习笔记(一):创建第一个仿真工程(基于CAN):点灯

    目录 内容: ①创建两个节点,Switch和Light节点 ②创建两个Panel界面 ③capl代码实现Switch控制Light亮灭 事先准备: 养成良好的习惯,将不同文件放入不同文件夹,创建如下几 ...

  6. 深入探索C++对象模型(Inside the C++ object model) -- 摘阅笔记(关于对象 - esp 1)

    Object Lessons 关于对象 在C语言中,"数据"和"处理数据的操作(函数)"是分开声明的,也就是说 ,语言本身并没有支持"数据和函数&qu ...

  7. C++面试八股文:了解auto关键字吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第15面: 面试官:了解auto关键字吗? 二师兄:嗯,了解一些(我很熟悉). 面试官:说一说auto的用法吧? 二师兄:auto主要是为了编译器进行 ...

  8. .Net7发现System.Numerics.Vector矢量化的一个bug,Issues给了dotnet团队

    因为前几天做.Net7的矢量化性能优化,发现了一个bug.在类System.Numerics.Vector里面的成员变量IsHardwareAccelerated.但是实际上不确定这个bug是visu ...

  9. R数据分析:解决科研中的“可重复危机”,理解Rmarkdown

    不知道刚接触科研的大伙儿有没有这么一个感觉,别人的研究很大可能你重复不出来,尤其是社科实证研究,到现在我都还觉得所谓的实证是个很玄乎的东西: 如果是刚开始做数据分析,很多时候你会发现自己的分析结果过几 ...

  10. 4. DI相关内容

    我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set 方法) 构造方法 依赖注入描述了在容器中建立 bean 与 bean 之间的依赖关系的过程,如果 bean 运行需要的是数字或字符串呢 ...