博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF OnApplyTemplate 不执行 或者执行滞后的疑惑
阅读量:6924 次
发布时间:2019-06-27

本文共 861 字,大约阅读时间需要 2 分钟。

OnApplyTemplate 不执行

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

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

问题

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

未将对象引用到实例

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

解释

,发现了这么一段代码

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

反思

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

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

转载于:https://www.cnblogs.com/HelloMyWorld/p/6704403.html

你可能感兴趣的文章
通过demo学习OpenStack开发所需的基础知识 -- 数据库(1)
查看>>
安卓 DevOps:从一次推送命令到生产
查看>>
单点登录的三种实现方式
查看>>
ZLG 发布开源 GUI 引擎 AWTK
查看>>
甲骨文称 Java 序列化的存在是个错误,计划删除
查看>>
融合了 JavaScript 之力的 Nashorn 或被 JDK 11 弃用
查看>>
DocHub v2.3 发布,构建你自己的百度文库
查看>>
vue-slideout 2.0 发布了,新增 ESC 键关闭
查看>>
java中的String为什么是不可变的
查看>>
自由的百科全书 Wikipedia 18 周岁了
查看>>
科创板今日起正式“开闸”,多家公司已处于上市辅导期 ...
查看>>
Fragment初学1——Fragment简介
查看>>
阿里云工程师(ACE)官方博客正式开通啦
查看>>
长文对话实录:国内物联网10年沉浮,AIoT技术如何破局?| AIoT+智慧城市峰会 ...
查看>>
特斯拉也裁员,马斯克长文诉苦:特斯拉太难了,真的没有办法! ...
查看>>
合理配置6大技术,优化全站HTTPS加密速度
查看>>
twisted服务器端客户端通信(转载填坑)
查看>>
访问控制-子账号授权
查看>>
android adb 进程端口号被占解决方法
查看>>
C# 定时关机小程序
查看>>