创建一个简单用户控件是开始自定义控件的好方法。本章主要介绍创建一个基本的颜色拾取器。接下来分析如何将这个控件分解成功能更强大的基于模板的控件。

  创建基本的颜色拾取器很容易。然而,创建自定义颜色拾取器仍是有价值的联系,因为这不仅演示了构建控件的各种重要概念,而且提供了一个实用的功能。

  可为颜色拾取器创建自定义对话框。但如果希望创建能集成进不同窗口的颜色拾取器,使用自定义控件是更好的选择。最简单的自定义控件类型是用户控件,当设计窗口或页面时通过用户控件可以使用相同的方式组装多个元素。因为仅通过直接组合现有控件并添加功能并不能实现颜色拾取器,所以用户控件看起来是更合理的选择。

  典型的颜色拾取器允许用户通过单击颜色梯度中的某个位置或分别指定红、绿和蓝三元色成分来选择颜色。下图显示了创建的基本颜色拾取器。该颜色拾取器包含三个Slider控件,这些控件用于调节颜色成分,同时使用Rectangle元素预览选择的颜色。

一、定义依赖性属性

  创建颜色拾取器的第一步是为自定义控件库项目添加用户控件。当添加用户控件后,Visual Studio会创建XAML标记文件和相应的包含初始化代码即事件处理代码的自定义类。这与创建新的窗口或也卖弄是相同的——唯一的区别在与顶级容器是UserControl类:

<UserControl x:Class="CustomControls.ColorPickerUserControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d"  Name="colorPicker">
</UserControl>

  最简单的起点是设计用户控件对外界公开的公共接口。换句话说,就是设计控件使用者使用的鱼颜色拾取器进行交互的属性、方法和事件。

  最基本的细节是Color属性——毕竟,颜色拾取器不过是用于显示和选择颜色的特定工具。为支持WPF特性,如数据绑定、样式以及动画,控件的可写属性几乎都是依赖项属性。

  在前面章节中学习过,创建依赖项属性的第一步是为之定义静态字段,并在属性名称的后面加上单词Property:

public static DependencyProperty ColorProperty;

  Color属性将允许控件使用者通过代码设置或检索颜色值。然而,颜色拾取器中的滑动条控件也允许用户修改当前颜色的一个方面。为实现这一设计,当滑动条额值发生变化时,需要使用事件处理程序进行响应,并且响应地更新Color属性。但使用数据绑定关联滑动条会更加清晰。为使用数据绑定,需要将每个颜色成分定义为单独的依赖项属性:

public static DependencyProperty RedProperty;
public static DependencyProperty GreenProperty;
public static DependencyProperty BlueProperty;

  尽管Color属性存储了System.Windows.Media.Color对象,但Red、Green以及Blue属性将存储表示每个颜色成分的单个字节值。

  为属性定义静态字段只有第一步。还需要有静态构造函数,用于在用户控件中注册这些依赖性属性,指定属性的名称、数据类型以及拥有属性的控件类。可通过传递具有正确标记设置的FrameworkPropertyMetadata对象,在静态构造函数中指定选择的特定属性特性(如值继承)。还可指出在什么地方为验证、数据强制以及属性更改通知关联回调函数。

  在颜色拾取器中,只需要考虑一个因素——当各种属性变化时需要关联回调函数进行响应。因为Red、Green和Blue属性实际上时Color属性的不同表示,并且如果一个属性发生变化,就需要确保其他属性保持同步。

  下面是注册颜色拾取器的4个依赖性属性的静态构造函数的代码:

static ColorPickerUserControl(){ColorProperty = DependencyProperty.Register("Color", typeof(Color),typeof(ColorPickerUserControl),new FrameworkPropertyMetadata(Colors.Black, new PropertyChangedCallback(OnColorChanged)));RedProperty = DependencyProperty.Register("Red", typeof(byte),typeof(ColorPickerUserControl),new FrameworkPropertyMetadata(new PropertyChangedCallback(OnColorRGBChanged)));GreenProperty = DependencyProperty.Register("Green", typeof(byte),typeof(ColorPickerUserControl),new FrameworkPropertyMetadata(new PropertyChangedCallback(OnColorRGBChanged)));BlueProperty = DependencyProperty.Register("Blue", typeof(byte),typeof(ColorPickerUserControl),new FrameworkPropertyMetadata(new PropertyChangedCallback(OnColorRGBChanged)));}

  现在已经定义了依赖性属性,可添加标准的属性封装器,使范文它们变得更加容易,并可在XAML中使用它们:

public Color Color{get { return (Color)GetValue(ColorProperty); }set { SetValue(ColorProperty, value); }}
public byte Red{get { return (byte)GetValue(RedProperty); }set { SetValue(RedProperty, value); }}public byte Green{get{return (byte)GetValue(GreenProperty);}set{SetValue(GreenProperty,value);}}
public byte Blue{get { return (byte)GetValue(BlueProperty); }set { SetValue(BlueProperty, value); }}

  请记住,属性封装器不能包含任何逻辑,因为可直接使用DependencyObject基类的SetValue()和GetValue()方法设置和检索属性。例如,在这个示例中的属性同步逻辑是使用回调函数实现的,当属性发生变化时通过属性封装器或者直接调用SetValue()方法引发回调函数。

更多干货 请点击这里

教你如何 构建基本的用户控件相关推荐

  1. (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)

    Web部件目录 我们已经见过了如何在 WebPartZones 控件中事先放入Web部件.你还可以用另外一种方法完成这个功能,那就是允许用户在运行时添加新的Web部件.通过使用 CatalogZone ...

  2. Repeater的嵌套结合用户控件的使用

    aspx页面的代码: <asp:Repeater ID="rpFL" runat="server"> <ItemTemplate> &l ...

  3. WPF 用户控件和 WPF自定义控件区别

    WPF 用户控件 将多个现有的控件组合成一个可重用的"组". 由一个XAML文件和一个后台代码文件. 不能使用样式和模板. 继承自UserControl类. WPF自定义控件(扩展 ...

  4. asp.net控件页面交互_ASP.NET Web窗体用户控件的基本交互

    asp.net控件页面交互 I saw a recent question regarding .NET - Render User Control Logo on Postback and deci ...

  5. 无边框窗体和用户控件以及权限

    无边框窗体: 就是吧窗体的边框去掉,然后自己做按钮设置功能. 无边框窗体的移动: 将下面代码直接复制粘贴,将窗体的鼠标按下事件的方法改成下面方法的名字就可以直接使用 1 //窗体移动API 2 [Dl ...

  6. C# 在用户控件中添加自定义事件

    /// <summary> /// 用户控件 /// </summary> public partial class UCMyControl : UserControl {// ...

  7. 用户控件和服务器控件的数据绑定

    一.绑定Repeater控件的数据源 aspx.cs文件中绑定Repeater控件的数据源在BindDataSource()中: protected override void BindDataSou ...

  8. Web用户控件的一个毛病

    前几天发现的,今天好好审查的 的确是.net 2.0的问题,也不知道是微软.net小组特意的,就是我在自定义的web 用户控件中,自定义的一些字段后,在页面中的对它的字段赋值,但是在web用户自定义控 ...

  9. 在asp.net中为Web用户控件添加属性和事件

    在90年代初,Microsoft为Web程序员提供的 Active Server Pages(ASP)革命性地改变了Web的编程.它可以利用十分易用的模型在Web服务器上动态生成HTML,并且很容易的 ...

最新文章

  1. linux系统桌面缺色,红旗系统如何用?
  2. [置顶]使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包...
  3. ubuntu彻底卸载mysql并且重新安装
  4. Hyperledger Fabric Rest API服务开发教程【含源码】
  5. 【MM模块】 Goods Receipt 收货 2
  6. 北斗导航 | 北斗RDSS受地面5G干扰影响的分析及对策研究
  7. windows下《Go Web编程》之Go命令
  8. libevent源码学习----io多路复用的封装和使用
  9. python基础有哪些内容_Python基础练习
  10. java中的接口的定义以及实现关系
  11. 容器的进程与namespace、rootfs
  12. 华为苏州人工智能研发基地揭牌 将容纳上万名工作人员
  13. 左移寄存器vhdl_VHDL实验代码:8位移位寄存器
  14. SSH 无法启动的原因分析及解决方法
  15. 怎么创建java项目?新建java项目的步骤
  16. VSCode配置SVN插件
  17. Unity 3D 特效学习记录
  18. WACV 2021 论文大盘点-GAN篇
  19. 苹果电脑快速重装Windows系统
  20. 遥控器的辨型 对码 对拷和焊码

热门文章

  1. serverless mysql_Serverless 解惑——函数计算如何访问 MySQL 数据库
  2. ViSP创建之VS工程详细创建步骤(命令行方式)
  3. 编写java程序的常见问题_Java程序的编写与执行、Java新手常见的问题解决
  4. bootstrap table 分组_bootstrap-table组合表头的实现方法
  5. pythonselenium实战 excel读取和写入_Python3.6+selenium2.53.6自动化测试_读取excel文件的方法...
  6. 以太坊白皮书_区块链60讲第33集~什么是以太坊?
  7. 产品运行所需的信息检索失败_域名解析失败
  8. Google Guava 概要
  9. 10个顶级的CSS UI开源框架
  10. ASP.NET Web API Model-ModelBinder