编码前

学习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. 小峰servlet/jsp(6)jstl核心标签库

    一.引入jstl 需要jstl.jar;standard.jar; 二.jstl核心标签库: c:out         内容输出标签; c:set      用来设置4种属性范围值的标签: c:re ...

  2. 分布式一致性协议之:Raft算法

    一致性算法Raft详解 背景 熟悉或了解分布性系统的开发者都知道一致性算法的重要性,Paxos一致性算法从90年提出到现在已经有二十几年了,而Paxos流程太过于繁杂实现起来也比较复杂,可能也是以为过 ...

  3. 学习笔记之Kubernetes

    Kubernetes | Production-Grade Container Orchestration https://kubernetes.io/ Kubernetes is an open-s ...

  4. sersync基于rsync+inotify实现数据实时同步

    一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...

  5. ssh-keygen的使用方法(无密码访问)

    一.概述 1.就是为了让两个linux机器之间使用ssh不需要用户名和密码.采用了数字签名RSA或者DSA来完成这个操作 2.模型分析 假设 A (192.168.20.59)为客户机器,B(192. ...

  6. jQuery 的noConflict()的使用.

    我们项目现在需要用到两个js库.一个是jQuery库,还有一个是我们自己开发的轻量级的gys.js库. 而gys库对外提供的接口也是$符号.和jQuery库是一样的,这个时候,两个库就会发生冲突了,我 ...

  7. Spark分析之Worker

    override def preStart() { webUi = new WorkerWebUI(this, workDir, Some(webUiPort)) webUi.bind() //创建并 ...

  8. django路由初识

    静态文件配置 1.项目下面新建一个文件夹static settings.py中最后添加 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static ...

  9. 理解prototype

    从别人的博客里面盗了2张图,这2张图将对象/实例/prototype/__proto__/constructor之间的关系描绘的很清楚. 1.prototype 为 function的属性,实例化的对 ...

  10. 常用模块:re ,shelve与xml模块

    一 shelve模块: shelve模块比pickle模块简单,只有一个open函数,所以使用完之后要使用f.close关闭文件.返回类似字典的对象,可读可写;key必须为字符串,而值可以是pytho ...