编码前

学习Windows phone自定义用户控件,在《WPF编程宝典》学习的小例子。并根据windows phone稍微的不同,做了点修改。ColorPicker(颜色拾取器):拥有三个Slider代表颜色中的RGB的值,可以进行调节各自的值。还有一个显示颜色的区域,它的值可以设置,也可以随着三个Slider值得变化而变化。其中每个Slider值也要根据颜色区域而变化。还要提供一个能由外部看到的可注册事件。

依赖属性:

设置四个依赖属性:分别为ColorProperty,RedProperty,GreenProperty,BlueProperty。

标准属性:为了访问容易,添加标准的属性封装器,并且好在xaml中使用绑定。分别为Color,Red,Green,Blue。

路由事件:为了当颜色变化时,控件外可以捕捉到,定义了一个路由事件。

编码

  1. 创建用户自定义控件(UserControl),命名为ColorPicker
  2. 插入四个依赖属性以及一般属性:
  1. public static readonly DependencyProperty ColorProperty = DependencyProperty.Register(  
  2.     "Color", typeof (Color), typeof (ColorPicker), new PropertyMetadata(default(Color),OnColorChanged));  
  3. public Color Color  
  4. {  
  5.     get { return (Color) GetValue(ColorProperty); }  
  6.     set { SetValue(ColorProperty, value); }  
  7. }  
  8.     
  9. public static readonly DependencyProperty RedProperty = DependencyProperty.Register(  
  10.     "Red", typeof (byte), typeof (ColorPicker), new PropertyMetadata(default(byte),OnColorRGBChanged));  
  11. public byte Red  
  12. {  
  13.     get { return (byte) GetValue(RedProperty); }  
  14.     set { SetValue(RedProperty, value); }  
  15. }  
  16.     
  17. public static readonly DependencyProperty BlueProperty = DependencyProperty.Register(  
  18.     "Blue", typeof(byte), typeof(ColorPicker), new PropertyMetadata(default(Byte),OnColorRGBChanged));  
  19. public byte Blue  
  20. {  
  21.     get { return (Byte) GetValue(BlueProperty); }  
  22.     set { SetValue(BlueProperty, value); }  
  23. }  
  24.     
  25. public static readonly DependencyProperty GreenProperty = DependencyProperty.Register(  
  26.     "Green", typeof (byte), typeof (ColorPicker), new PropertyMetadata(default(byte),OnColorRGBChanged));  
  27. public byte Green  
  28. {  
  29.     get { return (byte) GetValue(GreenProperty); }  
  30.     set { SetValue(GreenProperty, value); }  
  31. }  
  1. 每个属性更改的时候有一个回掉函数。RGB值更改时使用同一个回掉函数
  1. private static void OnColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)  
  2. {  
  3.     ColorPicker colorPicker = (ColorPicker) d;  
  4.     Color newColor = (Color)e.NewValue;  
  5.     Color oldColor = (Color) e.OldValue;  
  6.     
  7.     colorPicker.Red = (byte) newColor.R;  
  8.     colorPicker.Green = (byte) newColor.G;  
  9.     colorPicker.Blue = (byte) newColor.B;  
  10.       
  11. }  
  12. private static void OnColorRGBChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)  
  13. {  
  14.     ColorPicker colorPicker = (ColorPicker)d;  
  15.     Color newColor = colorPicker.Color;  
  16.     
  17.     if (e.Property == RedProperty)  
  18.         newColor.R = (byte)e.NewValue;  
  19.     else if (e.Property == BlueProperty)  
  20.         newColor.B = (byte)e.NewValue;  
  21.     else if (e.Property == GreenProperty)  
  22.         newColor.G = (byte)e.NewValue;  
  23.     
  24.     colorPicker.Color = newColor;  
  25. }  

此时的公开属性已经写完了,如果RGB属性或是Color属性变化,也会引起另一方值得改变

  1. 定义路由事件
  1. public event RoutedPropertyChangedEventHandler<Color> ColorChanged;  
  2.     
  3. protected void RaiseColorChanged(Color oldColor,Color newColor)  
  4. {  
  5.     RoutedPropertyChangedEventHandler<Color> temp = ColorChanged;  
  6.     
  7.     if (temp != null)  
  8.     {  
  9.         temp(thisnew RoutedPropertyChangedEventArgs<Color>(oldColor, newColor));  
  10.     }  
  11.  }  
  12.    

此处的ColorChanged就是控件公开的路由事件。当一个对象订阅了事件,RaiseColorChanged可以对象相应的操作。在什么时候引发RaiseColorChanged,我们将其放在OnColorChanged函数中,及当颜色变化时,查看是否有对象注册了事件,有的话则执行相应的操作。

  1. private static void OnColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)  
  2. {  
  3.     ColorPicker colorPicker = (ColorPicker) d;  
  4.     Color newColor = (Color)e.NewValue;  
  5.     Color oldColor = (Color) e.OldValue;  
  6.     
  7.     colorPicker.Red = (byte) newColor.R;  
  8.     colorPicker.Green = (byte) newColor.G;  
  9.     colorPicker.Blue = (byte) newColor.B;  
  10.     
  11.     colorPicker.RaiseColorChanged (newColor,oldColor);  
  12.  }  

ColorPicker的属性,事件已经定义好了。下面来设计一下他的外观。

  1. 在ColorPicker.xaml中来设计控件的外观。
  1. <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}">  
  2.     <Grid.RowDefinitions>  
  3.         <RowDefinition Height="Auto"/>  
  4.         <RowDefinition Height="Auto"/>  
  5.         <RowDefinition Height="Auto"/>  
  6.     </Grid.RowDefinitions>  
  7.     <Grid.ColumnDefinitions>  
  8.         <ColumnDefinition Width="*"/>  
  9.         <ColumnDefinition Width="Auto"/>  
  10.     </Grid.ColumnDefinitions>  
  11.     <Slider Minimum="0" Maximum="255" Value="{Binding Red,Mode=TwoWay}"/>  
  12.     <Slider Grid.Row="1" Minimum="0" Maximum="255" Value="{Binding Blue,Mode=TwoWay}"/>  
  13.     <Slider Grid.Row="2" Minimum="0" Maximum="255" Value="{Binding Green,Mode=TwoWay}"/>  
  14.     <Rectangle Grid.Column="1" Grid.RowSpan="3" Width="100" Height="100" Stroke="White" StrokeThickness="2">  
  15.         <Rectangle.Fill>  
  16.             <SolidColorBrush Color="{Binding Color}"/>  
  17.         </Rectangle.Fill>  
  18.     </Rectangle>  
  19. </Grid>

其中三个Slider的值设为0——255(一个字节可以接受的数值)。绑定的模式为TwoWay,也就是说颜色变化会影响到Slider值得变化,同样当改变Slider值得时候,颜色相应RGB值也将改变,从而改变颜色。

  1. 使用ColorPicker,在使用前要引入控件所在的命名空间。例如是定义在StudyTest空间下,因为和MainPage在同一个程序集中,所以引入命名空间映射到MainPage.xaml中即可:
  1. xmlns:local="clr-namespace:StudyTest">  

若是在不同的程序集中,还要加上程序集信息,例如:

xmlns:local="clr-namespace:StudyTest;assembly=...">

  1. 使用控件:
  1. <local:ColorPicker Margin="12"  Color="Turquoise" ColorChanged="ColorPicker_OnColorChanged"/>  
  1. private void ColorPicker_OnColorChanged(object sender, RoutedPropertyChangedEventArgs<Color> e)  
  2. {  
  3.     if(this.block!=null)  
  4.         this.block.Text=(string.Format("OldColor:{0}\n NewColor:{1}", e.OldValue, e.NewValue));  
  5. }  

使用到了路由事件ColorChanged,并在一个Textblock中显示颜色的相关信息

编码后

  1. 上面定义的用户控件是固定外观的,下面可以将其改成无外观的控件(外观可以通过改变他的可视化树来进行自定义),以获得更大的灵活性。(下一篇会写到)
  2. 上面的路由事件可以使用一般的事件进行处理,包括设计你想控件使用者会获得的哪些信息

Windows phone 自定义用户控件(UserControl)——ColorPicker的更多相关文章

  1. (九)ASP.NET自定义用户控件(2)

    http://www.cnblogs.com/SkySoot/archive/2012/09/04/2670678.html 用户控件 在 .NET 里,可以通过两种方式把自己的控件插入到 Web 窗 ...

  2. 用户控件(UserControl)

    简介 "用户控件"继承自UserControl,而UserControl继承自ContentControl,也就是内容控件UserControl和Window是一个层次上的,都有x ...

  3. 2018-8-10-win10-uwp-验证输入-自定义用户控件

    title author date CreateTime categories win10 uwp 验证输入 自定义用户控件 lindexi 2018-08-10 19:16:51 +0800 201 ...

  4. 在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件

    在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑.在开发Winform各种类型项 ...

  5. Windows.Forms Panel 动态加载用户控件 UserControl

    创建好一个Windows Forms程序,在创建好的程序中Form1添加一个Panel控件 如图:

  6. 浅尝辄止WPF自定义用户控件(实现颜色调制器)

    主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...

  7. C# 自定义用户控件

    上篇:控件制作 本例是制作一个简单的自定义控件,然后用一个简单的测试程序,对于初学者来说,本例子比较简单,只能起到抛石引玉的效果.我也是在学习当中,今后会将自己所学的逐步写出来和大家交流共享. 第一步 ...

  8. C# winform中自定义用户控件 然后在页面中调用用户控件的事件

    下面是用户控件的代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...

  9. 用户控件UserControl图片资源定位(一)---Xaml引用图片

    MEF编程实现巧妙灵活松耦合组件化编程,一些细节需要花费不小心思去处理: 其中组件中若包含用户控件,且需要访问图片资源,那么Xaml引用资源需要做以下设置 1. 用户控件(usercontrol)所在 ...

随机推荐

  1. 硬盘安装雨林木风Win7旗舰版系统教程

    硬盘安装雨林木风Win7旗舰版系统教程 安装完成,登录后报administrator无权限, F8 进入安全模式,修改administrator的权限.

  2. ORA-03113:通信通道的文件结尾

    问题: 用命令startup启动实例时,报错“ORA-03113:通信通道的文件结尾”. 解决: SQL> startup mount ORACLE 例程已经启动. Total System G ...

  3. pandas的read_csv函数

    pd.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, ...

  4. CGLib缺少jar出现 java.lang.ClassNotFoundException: org.objectweb.asm.Type

    CGLib实现动态代理区别于JDK动态代理,不需要目标类实现任何接口,是通过生成代理类子类的方式,而且据说速度要快于JDK动态代理.所以我想要试验一下CGlib的动态代理,网上找了些例子,自己动手写了 ...

  5. Spark SQL 基本原理

    Spark SQL 模块划分 Spark SQL架构--catalyst设计图 Spark SQL 运行架构 Hive的兼容性

  6. Linux常用命令的命名来源

    很多人在学习Linux的时候会疑惑:这么多的Linux名,他们都是怎么被定义的?林纳斯是怎么制定如此花样繁多且数量庞大的命令?今天这篇文章可能会帮你解开疑惑. ## 1. 目录缩写 缩写 | 全称 | ...

  7. 洛谷P1415 拆分数列

    题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...

  8. mysq更新(六) 单表查询 多表查询

      本节重点: 单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY fiel ...

  9. 并发基础(十) 线程局部副本ThreadLocal之正解

      本文将介绍ThreadLocal的用法,并且指出大部分人对ThreadLocal 的误区. 先来看一下ThreadLocal的API: 1.构造方法摘要 ThreadLocal(): 创建一个线程 ...

  10. C关键字typedef及argc,argv,env参数含义

    C关键字typedef--为C中各种数据类型定义别名. 在此插一点C知识 int main(int argc,const char *argv[],const char *envp[])主函数的红色部 ...