坑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学习 - 闭坑(持续更新)的更多相关文章

  1. 【pwn】学pwn日记——栈学习(持续更新)

    [pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...

  2. Pig基础学习【持续更新中】

    *本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...

  3. [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)

    持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...

  4. Java同步学习(持续更新)

    在需要考虑线程安全性的场合,可以考虑以下五种方式来实现线程的安全性: 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,   ...

  5. Linux学习历程(持续更新整理中)

    1.文件目录操作命令 (1) ls   显示文件和目录列表 a ls -l  显示文件的详细信息 b ls -a 列出当前目录的所有文件,包含隐藏文件. c stat '目录/文件'   显示指定目录 ...

  6. 数据分析之Pandas和Numpy学习笔记(持续更新)<1>

    pandas and numpy notebook        最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...

  7. Python基础学习总结(持续更新)

    https://www.cnblogs.com/jin-xin/articles/7459977.html 嗯,学完一天,白天上班,眼睛要瞎了= = DAY1 1,计算机基础. CPU:相当于人的大脑 ...

  8. Cadence物理库 LEF 文件语法学习【持续更新】

    我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索. 关注公众号,拉你进"IC设计交流群". @ 目录 一.LEF简介 1.1 通用规则 1.2 管理 LEF 文件 二. ...

  9. [Hadoop] Hadoop学习历程 [持续更新中…]

    1. Hadoop FS Shell Hadoop之所以可以实现分布式计算,主要的原因之一是因为其背后的分布式文件系统(HDFS).所以,对于Hadoop的文件操作需要有一套全新的shell指令来完成 ...

  10. Semantic ui 学习笔记 持续更新

    这个semantic 更新版本好快~ 首先是代码的标识<code></code> 具体样式就是红框这样的 圈起来代码感觉不错 不过要在semantic.css里在加上如下样式~ ...

随机推荐

  1. 一次redis主从切换导致的数据丢失与陷入只读状态故障

    背景 最近一组业务redis数据不断增长需要扩容内存,而扩容内存则需要重启云主机,在按计划扩容升级执行主从切换时意外发生了数据丢失与master进入只读状态的故障,这里记录分享一下. 业务redis高 ...

  2. kafka生产者你不得不知的那些事儿

    前言 kafka生产者作为消息发送中很重要的一环,这里面可是大有文章,你知道生产者消息发送的流程吗?知道消息是如何发往哪个分区的吗?如何保证生产者消息的可靠性吗?如何保证消息发送的顺序吗?如果对于这些 ...

  3. vue CLI 4 创建项目fetchMetadata资源拉取过慢解决方法

    最近将vue cli 升级到了 v4.0.5 创建项目的时候发现慢得想个蜗牛 仔细看这个日志会发现,mapToRegistry uri 是 taobao 这个一拉就是半天,还指不定那个时候就卡死在那里 ...

  4. odoo开发教程四:onchange、唯一性约束

    一:onchange机制[onchange=前端js函数!可以实现前端实时更新以及修改验证] onchange机制:不需要保存数据到数据库就可以实时更新用户界面上的显示. @api.onchange( ...

  5. RT_Device

    以上图片来自网页,非原创

  6. JS异步解决方案及优缺点

    1. 回调函数 优点: 解决了同步的问题(只要有一个任务耗时长后面的任务都会等待,会拖延程序执行) 缺点: 回调地狱  不能用try  catch捕获  不能用 return setTimeout(( ...

  7. Java NIO原理 (Selector、Channel、Buffer、零拷贝、IO多路复用)

    系列文章目录和关于我 零丶背景 最近有很多想学的,像netty的使用.原理源码,但是苦于自己对于操作系统和nio了解不多,有点无从下手,遂学习之. 一丶网络io的过程 上图粗略描述了网络io的过程,了 ...

  8. JumpServer安装及应用

    jumpserver安装 安装所需软件包 [root@localhost ~]# yum -y update [root@localhost ~]# dnf install -y wget curl ...

  9. 前端vue基于echart实现散点图

    前端vue基于echart实现散点图, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12866 效果图如下:   参考代码如 ...

  10. 解放计算力:使用并行处理提升python for循环速度

    Python 是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈.幸运的是,Python 提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作.本文将介绍如何 ...