异常产生环境:

在初始化一个窗口后,没有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 绑定异常处理的更多相关文章

  1. Laravel 流程分析——应用程序初始化

    在整体分析中,我们看到Laravel首先会进行一个app的初始化,代码如下: $app = require_once __DIR__.'/../bootstrap/app.php'; 我们具体看看ap ...

  2. Android系统的“程序异常退出”[转]

    在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场. 如何处理未捕获的异常呢? 首先我们要实现一个接口  java.lang.Thread.UncaughtExcep ...

  3. Laravel源码解析--看看Lumen到底比Laravel轻在哪里

    在前面一篇<Laravel源码解析--Laravel生命周期详解>中我们利用xdebug详细了解了下Laravel一次请求中到底做了哪些处理.今天我们跟 Lumen 对比下,看看 Lume ...

  4. Android使用UncaughtExceptionHandler捕获全局异常

    Android系统的“程序异常退出”,给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Thread.setDe ...

  5. JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器

    1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...

  6. Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器

    请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...

  7. 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器

    springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...

  8. Spring 4 异常处理

    异常与HTTP状态码的映射(@ResponseStatus) Spring默认会将自身抛出的异常自动映射到合适的状态码,如下是一些示例: 举个例子,当后端抛出如下异常(TypeMismatchExce ...

  9. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...

随机推荐

  1. SpringBoot入门:新一代Java模板引擎Thymeleaf(实践)

    菜鸟教程:http://www.runoob.com/ http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js http://apps.b ...

  2. 【52ABP实战教程】0.3-- 从github推送代码回vsts实现双向同步

    需求 在之前的文章中"[DevOps]如何用VSTS持续集成到Github仓库" 我们有讲述如何将vsts中的代码编译推送到github中,这一篇我们来完善,如果有人给你开源项目推 ...

  3. javascript学习总结一

    1. 变量提升hoisting 变量提升的意思是在一个变量作用域里定义的变量的声明会被提升到作用域的顶部,这是变量只会被声明,不会被初始化复制,而是undefined. 代码如下: function ...

  4. Java:import com.sun.awt.AWTUtilities;报错

    参考网址:http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-req ...

  5. css常见属性

    css常见属性 1.颜色属性 1.1 color属性定义文本的颜色 1.2 color:green 1.3 color:#ff6600 可简写为#f60 1.4 color:rgb(255,255,2 ...

  6. global关键字修改全局变量

    #我们知道全局变量在函数外部,强烈建议不要在函数内部修改全局变量,正常情况下,在函数内部改变全局变量并不影响全局变量的值,举例如下 count = 5 >>> def myfun() ...

  7. JavaScript初探之AJAX的应用

    什么是 AJAX1. AJAX = 异步 JavaScript 和 XML. 2. AJAX 是一种用于创建快速动态网页的技术. 3. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步 ...

  8. Linux下 Apache Vhost 配置 防止403

    首先,贴一份正确的配置(最简单的) <VirtualHost *:80> DocumentRoot /home/ubuntu/www/spider/public ServerName sp ...

  9. [NOI 2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  10. [HEOI2016]排序

    题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子 的:给出一个1到n的全排列,现在对这个全排列序列进 ...