在设计与开发 WPF 自界说控件时,我们每每为会控件添加一些依赖属性以便于绑定或动画等。事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称“只读属性”),以增加控件的灵活性。
这听起来有些矛盾。只读依赖属性,只能读不能写,却又怎么能提高控件的灵活性呢?想想我们常用的 IsMouseOver 等属性就可以理解,它们都是只读属性,但如果没有它们,想要控制样式将会很困难。
所以,总结来说,只读属性的特点是:无法赋值,不能绑定,不能用于动画,不能验证等;而之所以使用它,主要目的是结合属性触发器 (Trigger) 来实现样式的切换。
实践好比,我们要创建一个 FilePicker 控件,用户通过它可以选择文件。那么,它至少包孕一个 TextBlock(或 TextBox)和一个 Button,分袂用于显示选择文件的路径和打开对话框。
此刻我们想实现当用户选择了文件后,,控件泛起某种样式。要这么做,我们就可以增加一个 IsFilePicked 只读属性,然后在 ControlTemplate 中添加 Trigger 来控制样式的变革。
1. 创建(界说与注册)创建只读属性与创建普通依赖属性一样,包孕界说、注册、与 CLR 属性包装这三步。差此外是要使用 DependencyProperty 的 RegisterReadOnly 要领来注册,这个要领会返回 DependencyPropertyKey 东西,它包罗了对应只读属性的标识符,也就是与它关联的只读属性,并且对只读属性赋值也是通过它(注意:只读属性自身无法被赋值),代码如下:
// 只读属性的界说与注册 private static DependencyPropertyKey IsFilePickedPropertyKey = DependencyProperty.RegisterReadOnly("IsFilePicked", typeof(bool), typeof(FilePicker), new PropertyMetadata(false)); public static DependencyProperty IsFilePickedProperty = IsFilePickedPropertyKey.DependencyProperty;
注意此中的定名,因为我们要创建的属性是 IsFilePicked,所以上面两个变量都是在这个名称后加了后辍,分袂是 PropertyKey 和 Property,这是定名规范。
2. 包装然后,将它以 CLR 属性的方法来包装,由于这是个只读属性,所以只需要 get 段就可以,代码如下:
// 只读属性的包装 public bool IsFilePicked { get { return (bool)GetValue(IsFilePickedProperty); } }
3. 通过 DependencyPropertyKey 赋值在合适的位置(当用户选择过文件后),使用 SetValue 要领来赋值,SetValue 有两个重载,要为只读属性赋值,需使用第二个 SetValue(DependencyPropertyKey key, object value) ,代码如下:
SetValue(IsFilePickedPropertyKey, true);
4. 应用逻辑写好后,在模板中增加以下 XAML 代码,即可:
<ControlTemplate.Triggers> <Trigger Property="IsFilePicked" Value="True"> <!--显示绿色边框--> <Setter Property="BorderBrush" Value="Green" /> <Setter Property="BorderThickness" Value="2" /> </Trigger> </ControlTemplate.Triggers>
总结本文简单介绍了在 WPF 中如何创建以及使用只读依赖属性,合适地使用它,能够使我们更灵活地实现对自界说控件样式的控制。