MultiTigger 绑定异常处理
异常产生环境:
在初始化一个窗口后,没有show出来。在此窗口中,有个控件,重写了控件模板,并加了MultiTrigger。
注意:俩个Condition,一个是从外面绑定过来的Tag,一个是ControlTemplate中Element的属性Tag。
因为有时候控件自带的Tag值不够使用,因此需要另一个Tag来支持Trigger里面的逻辑。
<ControlTemplate TargetType="{x:Type p:InteractiveButton}">
<Grid x:Name="RootGrid" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<Border Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ContentPresenter ContentSource="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
<Image x:Name="Image5" Visibility="Collapsed" Source="{StaticResource Image.Titlebar.NewMessageNote}"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Tag" Value="Searched">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Image5" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="Image5" Storyboard.TargetProperty="Height"
From="2" To="15" Duration="0:0:0.2"></DoubleAnimation>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Tag" Storyboard.TargetProperty="Tag">
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="NewMessageAnmation1" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
<Trigger SourceName="RootGrid" Property="Tag" Value="NewMessageAnmation1">
<Trigger.EnterActions>
<BeginStoryboard Name="BreatheStoryboard">
<Storyboard DesiredFrameRate="20">
<DoubleAnimation Storyboard.TargetName="Image5" Storyboard.TargetProperty="Height"
From="10" To="2" RepeatBehavior="Forever" AutoReverse="True" Duration="0:0:0.68"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Tag" Value="Searching" />
<Condition SourceName="RootGrid" Property="Tag" Value="NewMessageAnmation1” />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="#F4F4F4" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Button Tag={Binding Type}/>
然后在另一窗口或者后台线程中,添加了PropertyChanged的属性Type,值改变时
private string _type = string.Empty;
public string Type
{
get { return _type; }
set
{
_type = value;
RaisePropertyChanged(nameof(Type));
}
}
引进上面的MultiTrigger中一个Condition 值变化,但是另一个Condition和Setter(Actions)引用了ControlTemplate中的Eelement,这时会引发
未将对象引用到实例

如上异常,解决方案:
用附加属性替代 SourceName="RootGrid" Property="Tag" .即可
<ControlTemplate TargetType="{x:Type p:InteractiveButton}">
<Grid x:Name="RootGrid" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
<Border Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ContentPresenter ContentSource="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
<Image x:Name="Image5" Visibility="Collapsed" Source="{StaticResource Image.Titlebar.NewMessageNote}"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Tag" Value="Searched">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Image5" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="Image5" Storyboard.TargetProperty="Height"
From="2" To="15" Duration="0:0:0.2"></DoubleAnimation>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(ui:TitlebarHelper.Type)">
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="NewMessageAnmation1" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
<Trigger Property="ui:TitlebarHelper.Type" Value="NewMessageAnmation1">
<Trigger.EnterActions>
<BeginStoryboard Name="BreatheStoryboard">
<Storyboard DesiredFrameRate="20">
<DoubleAnimation Storyboard.TargetName="Image5" Storyboard.TargetProperty="Height"
From="10" To="2" RepeatBehavior="Forever" AutoReverse="True" Duration="0:0:0.68"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Tag" Value="Searching" />
<Condition Property="ui:TitlebarHelper.Type" Value="NewMessageAnmation1” />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="#F4F4F4" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Button Tag={Binding Type}/>
public static class TitlebarTypeHelper
{
public static string GetType(DependencyObject obj)
{
return (string)obj.GetValue(TypeProperty);
} public static void SetType(DependencyObject obj, string value)
{
obj.SetValue(TypeProperty, value);
} /// <summary>
/// 附加属性
/// </summary>
public static readonly DependencyProperty TypeProperty =
DependencyProperty.RegisterAttached("Type", typeof(string), typeof(TitlebarTypeHelper),
new PropertyMetadata(null));
}
MultiTigger 绑定异常处理的更多相关文章
- Laravel 流程分析——应用程序初始化
在整体分析中,我们看到Laravel首先会进行一个app的初始化,代码如下: $app = require_once __DIR__.'/../bootstrap/app.php'; 我们具体看看ap ...
- Android系统的“程序异常退出”[转]
在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场. 如何处理未捕获的异常呢? 首先我们要实现一个接口 java.lang.Thread.UncaughtExcep ...
- Laravel源码解析--看看Lumen到底比Laravel轻在哪里
在前面一篇<Laravel源码解析--Laravel生命周期详解>中我们利用xdebug详细了解了下Laravel一次请求中到底做了哪些处理.今天我们跟 Lumen 对比下,看看 Lume ...
- Android使用UncaughtExceptionHandler捕获全局异常
Android系统的“程序异常退出”,给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Thread.setDe ...
- JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器
1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...
- Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器
请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...
- 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器
springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...
- Spring 4 异常处理
异常与HTTP状态码的映射(@ResponseStatus) Spring默认会将自身抛出的异常自动映射到合适的状态码,如下是一些示例: 举个例子,当后端抛出如下异常(TypeMismatchExce ...
- 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL
本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...
随机推荐
- 阿里云API网关(3)快速入门(调用 API)
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 使用TortoiseSVN打Tag
参考了 https://blog.csdn.net/liuzx32/article/details/9123401. 值得注意的点是: 选择路径的时候,不要先点进去自己建好叶子节点路径再选择该路径,会 ...
- Linux:日期用法,及格式定义
在shell脚本中经常会需要获取当前日期的地方,linux的系统时间在shell里是可以直接调用系统变量: 获取今天时期---`date +%Y%m%d` 或 `date +%F` 或 $(date ...
- 3分钟搞掂Set集合
前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单[源码剖析] Map集合.散列表.红黑树介绍 HashMap就是这么简单[源码剖析] LinkedH ...
- 六,前端---viewport
移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,再具体一点,就是浏览器上用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区 ...
- PostgreSQL 常用系统自带方法
数据库字符编码问题: -- 查看PostgreSQL数据库服务器端编码: show server_encoding; -- 查看PostgreSQL客户端工具psql编码: s ...
- [LeetCode] Lonely Pixel II 孤独的像素之二
Given a picture consisting of black and white pixels, and a positive integer N, find the number of b ...
- 【linux之压缩归档,tar】
一.压缩和归档 压缩算法就是等量代换 gzip FILE1 FILE2... 扩展名 .gz -#(数字):#代表压缩等级,1-9,默认6 -d(compression):解压缩 -r:递归的压缩目录 ...
- Centos6.9连接工具设置
由于vm下面的centos6.9这种操作环境非常的不友好,用起来非常的不方便, 所以我们需要用一个远程连接工具来连接,我们的虚拟机.我们使用的是teraterm. 下载地址:https://osdn. ...
- 再深刻理解下web3.js中estimateGas如何计算智能合约消耗的gas量
我们可使用web3.js框架的estimateGas函数获得一个以太坊智能合约的Gas估计值 ,通过执行一个消息调用或交易,该消息调用或交易直接在节点的VM中执行,并未在区块链中确认,函数会返回估算使 ...