OnApplyTemplate 不执行

平时如何开发自定义控件的

在WPF自定义控件开发的过程中遇到了这样一个问题,属性更改事件在OnApplyTemplate之前执行。我在写自定义控件的时候,喜欢通过OnApplyTempalte重写方法获取到Style中的所有控件,进而在属性更改通知时修改这些控件的值。

问题

所有暴露的依赖属性都是通过Binding来赋值的。今天的案例特殊,某个属性不需要Binding赋值,直接给值即可,于是运行时出问题了。

未将对象引用到实例

很普通的一个错误,然后却暴露了属性更改通知先于OnApplyTemplate执行的问题。

解释

只有看源码,发现了这么一段代码

注意MeasureCore这个方法,这个是发生了布局重绘重计算时会执行的,那么就是说OnApplyTemplate发生在显示的时候,而简单的属性设置立马就生效,不需要等到控件显现出来,只要控件对象存在就能执行,这就是为什么依赖属性直接设置的话,他的属性更改事件会先于OnApplyTemplate执行。使用Binding的话,不会出现这个问题,因为Binding至少也要等到控件绘制完成执行才有意义。

反思

那么是不是自定义控件的两种方式不能共存?肯定不是的,WPF官方的Button就能同时适应这两种情况,于是再去看看Button的源码,根本就没有用到OnApplyTemplate方法,并且看他的Style,内容样式绑定都是使用了TemplateBinding来完成。最后得出了结论就是:简单的自定义样式开发,其实都可以通过在其Style文件中使用TemplateBinding来完成。也就是自定义控件的样式开发和后台逻辑只关注依赖属性,不关注具体使用了什么控件。通过OnApplyTempalte方法来获取具体控件的方法用在一些高级的自定义控件上。

记录下来,因为网上搜半天也没人能说清个所以然,希望能帮助到你们。

WPF OnApplyTemplate 不执行 或者执行滞后的疑惑的更多相关文章

  1. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  2. 深入学习JS执行--创建执行上下文(变量对象,作用域链,this)

    一.介绍 本篇继上一篇深入理解js执行--单线程的JS,这次我们来深入了解js执行过程中的执行上下文. 本篇涉及到的名词:预执行,执行上下文,变量对象,活动对象,作用域链,this等 二.预执行 在上 ...

  3. JS执行上下文(执行环境)详细图解

    JS执行上下文(执行环境)详细图解 先随便放张图 我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题.比如先来一个简单一点的. console.log(a); // 这里会打印出什么? v ...

  4. 前端高质量知识(二)-JS执行上下文(执行环境)详细图解Script

    先随便放张图 我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题.比如先来一个简单一点的. console.log(a); // 这里会打印出什么? var a = 20; PS: 变量提 ...

  5. php中代码执行&&命令执行函数

    转自i春秋 1.eval()函数 #传入的参数必须为PHP代码,既需要以分号结尾. #命令執行:cmd=system(whoami); #菜刀连接密码:cmd <?php @eval($_POS ...

  6. 风炫安全web安全学习第三十节课 命令执行&代码执行基础

    风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...

  7. ThreadPoolTimer -延迟执行, 周期执行

    介绍重新想象 Windows 8 Store Apps 之 线程池 通过 ThreadPoolTimer 实现延迟执行 通过 ThreadPoolTimer 实现周期执行 通过 ThreadPool ...

  8. JVM-绘图展现字节码执行引擎执行过程

    在我的上一篇博客JVM-String比较-字节码分析中介绍了String字符串比较的原因,借着分析字节码的机会,我这篇博客将会绘图展现方法内部字节码执行过程. 话不多说,贴上我们将要分析的Java方法 ...

  9. 【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行

    参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 1.命令执行 MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSO ...

随机推荐

  1. 新版 Spring下载方法

    1.百度 Spring 打开官方网站   http://spring.io/ 2.======================================= 3.================= ...

  2. 《Spring实战》系列之Bean的装配-Days02

    2.1 回顾 对于我第一天在bean的装配中写的,是一些基本的语法或者是Spring本身的一些规定,但是我没有对此进行深究.接下来就让我们仔细的讨论一下细节问题.和传统的类的定义和方法的调用做一些比较 ...

  3. hadoop-2.3.0-cdh5.1.0伪分布安装(基于centos)

    一.环境 操作系统:CentOS 6.5 64位操作系统  注:Hadoop2.0以上采用的是jdk环境是1.7,Linux自带的jdk卸载掉,重新安装 下载地址:http://www.oracle. ...

  4. HDFS内容追加

    配置:hdfs-site.xml <property> <name>dfs.support.append</name> <value>true</ ...

  5. 10、scala模式匹配

    一.模式匹配1 1.介绍 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件, 进行不同的处理. ...

  6. 3.Windows应急响应:蠕虫病毒

    0x00 前言 蠕虫病毒是一种十分古老的计算机病毒,它是一种自包含的程序(或是一套程序),通常通过网络途径传播, 每入侵到一台新的计算机,它就在这台计算机上复制自己,并自动执行它自身的程序.常见的蠕虫 ...

  7. hdu1077

    #include<iostream> #include<cmath> using namespace std; struct Point { double x,y; }; do ...

  8. NULL 与 ""

    char *str1 = NULL; //str1为空 char *str2 = ""; //str2为一个空字符串 NULL没有分配空间,""分配了空间.

  9. Libvirt代码架构

    Libvirt介绍 参考资料 Libvirt学习 通过virsh了解libvirt api的调用方式 通过virHypervisorDriver了解libvirt api的实现 virsh代码阅读 通 ...

  10. Go:Nsq消息队列

    Nsq服务端简介 在使用Nsq服务之前,还是有必要了解一下Nsq的几个核心组件整个Nsq服务包含三个主要部分 nsqlookupd 先看看官方的原话是怎么说:nsqlookupd是守护进程负责管理拓扑 ...