坑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. T-SQL——批量刷新视图

    目录 0. 背景说明 1. 查询出所有使用了指定表的视图并生成刷新语句 2. 创建存储过程批量刷新 3. 刷新全部的视图 4. 参考 shanzm--2023年5月16日 0. 背景说明 为什么要刷新 ...

  2. linux DHCP

    目录 一.DHCP概念 二.DHCP工作过程 三.DHCP实验 一.DHCP概念 概念:动态主机配置协议,自动为计算机分配tcp/ip参数 DHCP的优点:1.减少管理员的工作难度 2.避免错误的可能 ...

  3. 使用Cordova插件实现两个app之间的相互调用和通讯

    几年前使用Cordova 进行两个app之间的相互调用和通讯:当时也是几经折腾,今天把它整理出来,理一下思路,也方便有同样需求的朋友参考 一.require引入 plugin require(&quo ...

  4. 文件系统考古:1974-Unix V7 File System

    有时,进步难以察觉,特别是当你正身处其中时.而对比新旧资料之间的差异,寻找那些推动变革的信息源,我们就可以清晰地看到进步的发生.在Linux(以及大部分Unix系统)中,都可以印证这一点. Unix ...

  5. WPF实现新手引导

    1. 半透明灰的遮罩层 新建一个遮盖的window窗体 canvas是后期可以在思显示高亮区域 //定义一个window将它的样式设置透明等可以覆盖到其他窗体上,其中遮罩层使用border控件 //原 ...

  6. C#.NET Framework RSA 私钥签名 公钥验签(验证签名) ver:20230612

    C#.NET Framework RSA 私钥签名 公钥验签(验证签名) ver:20230612 环境说明: .NET Framework 4.6 的控制台程序 . .NET Framework 对 ...

  7. java调用WebService(未完成)记录篇

    背景: 因工作需要和一个Sap相关系统以WebService的方式进行接口联调,之前仅听过这种技术,但并没有实操过,所以将本次开发相关的踩坑进行记录 通过一个实例来认识webservice 服务端 首 ...

  8. rabbitmq安装部署和常用命令

    python操作rabbitmq rabbitmq实现可以使用java或者springboot的封装方法,自己创建实现,也可以使用中间件实现,相对于自建,使用rabbitmq应用场景及使用更系统安全. ...

  9. 面试官:讲讲MySql索引失效的几种情况

    索引失效 准备数据: CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAUL ...

  10. MODBUS-TCP转Ethernet IP 网关连接空压机配置案例

    本案例是工业现场应用捷米特JM-EIP-TCP的Ethernet/IP转Modbus-TCP网关连接欧姆龙PLC与空压机的配置案例.使用设备:欧姆龙PLC,捷米特JM-EIP-TCP网关, ETHER ...