编码前

学习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. sping mvc+uploadify 上传文件大小控制3部曲

    页面使用uploadify 上传控件,使用spring CommonsMultipartipartResolver , 反向代理nginx nginx 配置文件 client_max_body_siz ...

  2. 技巧:利用putty通过win7访问ubuntu

    .用apt-get直接安装SSHD服务所需相关软件包: sudo apt-get install openssh-server .开启服务: sudo /etc/init.d/sshd start p ...

  3. Git 查询某次历史提交的修改内容

    在工作时,有时候想查看某次的提交修改了哪些的内容. 我们首先可以git log显示历史的提交列表: 之后我们用git show <commit-hashId> 便可以显示某次提交的修改内容 ...

  4. Java反射机制 —— 简单了解

    一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  5. metaq架构原理

      原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2034111 本来只是想看下metaq的文档,结果发现好乱,现在metaq其实有两个大分支了,一个是庄晓丹 ...

  6. Python小代码

    from bs4 import BeautifulSoup import requests url = 'http://www.tripadvisor.cn/Attractions-g60763-Ac ...

  7. python的高阶函数(map,reduce,filter)

    Map函数 Map()函数接受两个参数,第一个参数是函数,第二个参数是序列(list,tuple),map将函数依次作用到序列上的每一个元素上,并发结果作为新的list返回 其中map的第一个参数的函 ...

  8. Pillow 读取图片截断错误

    做图像处理的时候,Pillow是经常使用到的模块. 最近在读取图片的时候出现了一个错误. OSError: image file is truncated (461 bytes not process ...

  9. HP服务器安装配置教程

    使用iLO远程管理HP系列服务器 http://blog.51cto.com/wangchunhai/837529

  10. jsonUtils&&Json、Xml转换工具Jackson使用

    1.jsonUtils package com.icil.utils; import java.util.List; import com.fasterxml.jackson.core.JsonPro ...