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里在加上如下样式~ ...
随机推荐
- 浅谈 OI 中各种合并操作
前言 合并操作一直是 OI 中一大考点,今天请各位跟着笔者来梳理一下各种合并操作. 启发式合并 几乎可以说是最经典的合并了. 假定我们可以在 \(O(k)\) 的时间内往某个集合中插入一个数,那么我们 ...
- drf——登录功能、认证、权限、频率组件(Django转换器、配置文件作用)
Django转换器.配置文件作用 # django转换器 2.x以后 为了取代re_path int path('books/<int:pk>')--->/books/1---> ...
- Python相关镜像
Python相关镜像 (1) pip使用说明 对于Python开发用户来讲,我们会经常使用pip安装软件包.但国外的源下载速度实在太慢,浪费时间且经常出现下载后安装出错问题.所以把PIP安装源替换成国 ...
- 第一单元 .Net 平台介绍
第一单元 .Net 平台介绍 学习编程,电脑基本配置(当然配置越高越好): 内存 :初期学习8 G,后期可能跟不上, 最好16 G以上 硬盘:500 G,5400 转速,至少C盘是固态,全是固态最好 ...
- Kubernetes(k8s)健康性检查:livenessprobe探测和readinessprobe探测
目录 一.系统环境 二.前言 三.Kubernetes健康性检查简介 四.创建没有探测机制的pod 五.添加livenessprobe探测 5.1 使用command的方式进行livenessprob ...
- Hybrid 实验
实验拓扑 实验需求 按图示给各 PC 配置 IP 地址 PC1属于 VLAN 10 : PC2 与 PC5 属于 VLAN 20:PC4属于 VLAN 30 实现全网互通 实验步骤 1.配置链路聚合 ...
- 公路堵车概率模型Python(Nagel-Schreckenberg交通流模型)
路面上有N辆车,以不同速度向前行驶,模拟堵车问题.有以下假设: 假设某辆车的当前速度是 v 如果 前方可见范围内没车,下一秒车速提高到 v+1 如果 前方有车,前车的距离为 d ,且 d < v ...
- HTML5新特性之Web Storage
Web Storage是HTML5新增的特性,能够在本地浏览器存储数据,对数据的操作很方便,最大能够存储5M. Web Storage有两种类型: SessionStorage 和 LocalStor ...
- StencilJs学习之事件
其实并没有所谓的 stencil Event,相反 stencil 鼓励使用 DOM event.然而,Stencil 提供了一个 API 来指定组件可以触发的事件,以及组件监听的事件. 这是通过 E ...
- TornadoFx 页面之间的数据传递
原文地址: TornadoFx 页面之间的数据传递 - Stars-One的杂货小窝 和Android开发一样,经常遇到两个页面之间需要进行数据的交互传输,本文讲解下TornadoFx框架中,页面之间 ...