WPF: 只读依赖属性的介绍与实践

在设计与开发 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 中如何创建以及使用只读依赖属性,合适地使用它,能够使我们更灵活地实现对自定义控件样式的控制。

原文地址:https://www.cnblogs.com/wpinfo/p/readonly_dp.html

时间: 2024-08-25 08:27:23

WPF: 只读依赖属性的介绍与实践的相关文章

WPF的依赖属性和附加属性(用法解释较全)

转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最重要的知识点——依赖属性. 二.依赖属性的全面解析 听到依赖属性,自然联想到C#中属性的概念.C#中属性是抽象模型的核心部分,而依赖属性是专门基于WPF创建的.在WPF库实现中,

WPF之依赖属性

一站式WPF--依赖属性(DependencyProperty)一 一站式WPF--依赖属性(DependencyProperty)二 WPF之依赖属性

WPF利用依赖属性和命令编写自定义控件

以实例讲解(大部分讲解在代码中) 1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试, <UserControl x:Class="SelfControlDenpendy.SelfControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006

Windbg调试WPF的依赖属性

?? 我们用wndbg调试时,很多时候需要查看某个控件的依赖属性值. 比如:我们查看DataGridColumnHeader的Content依赖属性   1.我们用到的windbg的命令有:!do, !da -details, .formats  2.利用!do查看依赖对象的成员变量, 找到具体依赖属性的地址 0:000> !do 00000000039a71d8 Name:        System.Windows.Controls.Primitives.DataGridColumnHead

说说WPF的依赖属性

首先,我们先来大概了解一下依赖属性 什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值. 依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费.所以用依赖属性,用不着就不用,用得着就用. 怎么声明依赖属性:用public static readonly三个修饰符修饰. 怎么声明实例:使用DependencyProperty.Register方法生成.此方法有三个参数跟四个参数. 怎么操作依赖属性的值:利用依赖对象(Dependency Objec

(WPF)依赖属性

属性触发器: <Button MinWidth=" 75" Margin="10"> <Button.Style> <Style TargetType="{x:Type Button}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Proper

WPF自定义控件 依赖属性绑定

控件cs文件 using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Markup; using System.Windows.Media; namespace Controls { [TemplatePart(Name = "PART_DropDown"

WPF快速入门系列(2)——深入解析依赖属性

一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最重要的知识点——依赖属性. 二.依赖属性的全面解析 听到依赖属性,自然联想到C#中属性的概念.C#中属性是抽象模型的核心部分,而依赖属性是专门基于WPF创建的.在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使得我们可以通过和以前一样的方式来使用依赖属性,但我们必须明确,在WPF中我们大多数

WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)

一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期几个月在筹备"云计算之旅"系列,所以一再推迟了公布进度. 之前一直都没有想过要录制视频.基本的原因还是怕自己知识有限,从而误导他人,所曾经几次浪曦和51CTO邀请录制视频,我都以工作忙.公司内部培训须要时间和自己有待提高等理由委婉的拒绝了,说实在的.自己也知道自己还有非常多地方有待提高.还