WPF学习 - 闭坑(持续更新)
阅读原文时间:2023年09月05日阅读:2

坑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这个依赖属性。

虽然不影响正常的编译,但总有个错误存在,看着也心烦。所以还是像上面那样,加上那条依赖属性的声明语句吧。

以上是自己的一点经验总结,仅做记录用。如有错误,还请大神指正。

本文将持续更新。