WPF学习 - 闭坑(持续更新)
坑1:自定义控件设计原则:
既然称之为控件,那么就必定有界面与行为两部分。
界面就是展示给用户看的,用于承载类的属性、方法、事件等。
行为就是类的方法,以及这些方法需要用到的属性、字段等。
WPF设计的原则就是界面与行为分离!分离!分离!一定要记得分离。
这里的分离,不是指代码写的地方要分离开,一个在CS文件中,一个在xaml文件中。而是指代码的逻辑关系要解耦合,不能相互引用。
那么如何分离呢?一种方法是:即使在没有界面的时候,代码也能正常工作(除非某些情况必须有UI元素的参与)。
因此,后代代码必须要提供相应的属性,方法,命令等。它可以独立且正确的工作。如果用户赋予它一个UI,只需要绑定到正确的属性、命令就可以展示了。
因此,在设计一个自定义控件时,可以试着在后台代码中,将UI部分的内容删除(或者尽量减少),看它是否工作正常。
坑2:自定义控件的初始化顺序:
在自定义控件中,通常会有一个OnApplyTemplate()的重载方法。它会在加载模板的时候调用。
很多人会先入为主的认为,WPF与WinForm一样,会先初始化控件的UI部分(在InitialConponent()方法中)。实际上却不是的。WPF在创建对象的时候,其实就是创建类的对象。先调用构造函数,再初始化字段(可能我理解有误),总之就是对象创建好了,再调用OnApplyTemplate()方法。此时才有界面。
因此,如果后台代码中的属性、方法有对UI的直接操作,就必须判断UI是否存在。因此才有上面的坑1。一定要分离。
坑3:自读依赖属性:找不到属性。
自读依赖属性,需要使用DependencyProperty.RegisterReadOnly()方法来注册。但是这个方法返回的是DependencyPropertyKey的对象。这个对象中就包含了依赖属性。
完整代码如下所示:
internal static readonly DependencyPropertyKey HasMultiFramesPropertyKey =
DependencyProperty.RegisterReadOnly(
"HasMultiFrames",typeof(bool),typeof(ImgViewer),
new PropertyMetadata(false)); internal static readonly DependencyProperty HasMultiFramesProperty =
HasMultiFramesPropertyKey.DependencyProperty; public bool HasMultiFrames
{
get => (bool)GetValue(HasMultiFramesProperty);
}
有人就问了,HasMultiFramesProperty就是对HasMultiFramesPropertyKey.DependencyProperty的引用,那没有必须写这一句,直接在CLR属性中的get索引中使用就可以。写成下面这样子:
internal static readonly DependencyPropertyKey HasMultiFramesPropertyKey =
DependencyProperty.RegisterReadOnly(
"HasMultiFrames",typeof(bool),typeof(ImgViewer),
new PropertyMetadata(false)); public bool HasMultiFrames
{
get => (bool)GetValue(HasMultiFramesPropertyKey.DependencyProperty);
}
我想说,这种方法也ok。运行的时候是没有问题的。但是在xaml中会出现一条错误信息:
这个问题的出现,其实就是xaml找不到HasMultFramesProperty这个依赖属性。
虽然不影响正常的编译,但总有个错误存在,看着也心烦。所以还是像上面那样,加上那条依赖属性的声明语句吧。
以上是自己的一点经验总结,仅做记录用。如有错误,还请大神指正。
本文将持续更新。
WPF学习 - 闭坑(持续更新)的更多相关文章
- 【pwn】学pwn日记——栈学习(持续更新)
[pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...
- Pig基础学习【持续更新中】
*本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...
- [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)
持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...
- Java同步学习(持续更新)
在需要考虑线程安全性的场合,可以考虑以下五种方式来实现线程的安全性: 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, ...
- Linux学习历程(持续更新整理中)
1.文件目录操作命令 (1) ls 显示文件和目录列表 a ls -l 显示文件的详细信息 b ls -a 列出当前目录的所有文件,包含隐藏文件. c stat '目录/文件' 显示指定目录 ...
- 数据分析之Pandas和Numpy学习笔记(持续更新)<1>
pandas and numpy notebook 最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...
- Python基础学习总结(持续更新)
https://www.cnblogs.com/jin-xin/articles/7459977.html 嗯,学完一天,白天上班,眼睛要瞎了= = DAY1 1,计算机基础. CPU:相当于人的大脑 ...
- Cadence物理库 LEF 文件语法学习【持续更新】
我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索. 关注公众号,拉你进"IC设计交流群". @ 目录 一.LEF简介 1.1 通用规则 1.2 管理 LEF 文件 二. ...
- [Hadoop] Hadoop学习历程 [持续更新中…]
1. Hadoop FS Shell Hadoop之所以可以实现分布式计算,主要的原因之一是因为其背后的分布式文件系统(HDFS).所以,对于Hadoop的文件操作需要有一套全新的shell指令来完成 ...
- Semantic ui 学习笔记 持续更新
这个semantic 更新版本好快~ 首先是代码的标识<code></code> 具体样式就是红框这样的 圈起来代码感觉不错 不过要在semantic.css里在加上如下样式~ ...
随机推荐
- 一次redis主从切换导致的数据丢失与陷入只读状态故障
背景 最近一组业务redis数据不断增长需要扩容内存,而扩容内存则需要重启云主机,在按计划扩容升级执行主从切换时意外发生了数据丢失与master进入只读状态的故障,这里记录分享一下. 业务redis高 ...
- kafka生产者你不得不知的那些事儿
前言 kafka生产者作为消息发送中很重要的一环,这里面可是大有文章,你知道生产者消息发送的流程吗?知道消息是如何发往哪个分区的吗?如何保证生产者消息的可靠性吗?如何保证消息发送的顺序吗?如果对于这些 ...
- vue CLI 4 创建项目fetchMetadata资源拉取过慢解决方法
最近将vue cli 升级到了 v4.0.5 创建项目的时候发现慢得想个蜗牛 仔细看这个日志会发现,mapToRegistry uri 是 taobao 这个一拉就是半天,还指不定那个时候就卡死在那里 ...
- odoo开发教程四:onchange、唯一性约束
一:onchange机制[onchange=前端js函数!可以实现前端实时更新以及修改验证] onchange机制:不需要保存数据到数据库就可以实时更新用户界面上的显示. @api.onchange( ...
- RT_Device
以上图片来自网页,非原创
- JS异步解决方案及优缺点
1. 回调函数 优点: 解决了同步的问题(只要有一个任务耗时长后面的任务都会等待,会拖延程序执行) 缺点: 回调地狱 不能用try catch捕获 不能用 return setTimeout(( ...
- Java NIO原理 (Selector、Channel、Buffer、零拷贝、IO多路复用)
系列文章目录和关于我 零丶背景 最近有很多想学的,像netty的使用.原理源码,但是苦于自己对于操作系统和nio了解不多,有点无从下手,遂学习之. 一丶网络io的过程 上图粗略描述了网络io的过程,了 ...
- JumpServer安装及应用
jumpserver安装 安装所需软件包 [root@localhost ~]# yum -y update [root@localhost ~]# dnf install -y wget curl ...
- 前端vue基于echart实现散点图
前端vue基于echart实现散点图, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12866 效果图如下: 参考代码如 ...
- 解放计算力:使用并行处理提升python for循环速度
Python 是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈.幸运的是,Python 提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作.本文将介绍如何 ...