主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下

首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mvvm的模式去编写代码,直接把控件的逻辑写在了cs文件中。废话不多说上代码。

1.首先是三个滑动条(值为0-255,各自代表三原色,红蓝绿)和一个右边的显示区域的依赖属性的注册

        public static DependencyProperty ColorProperty;
public static DependencyProperty RedProperty;
public static DependencyProperty GreenProperty;
public static DependencyProperty BlueProperty;
public ColorPickerControl()
{
InitializeComponent();
}
static ColorPickerControl()
{
//注册属性
ColorProperty = DependencyProperty.Register("Color", typeof(Color), typeof(ColorPickerControl), new FrameworkPropertyMetadata(Colors.Black, new PropertyChangedCallback(OnColorChanged)));
RedProperty = DependencyProperty.Register("Red", typeof(byte), typeof(ColorPickerControl), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnRGBChanged)));
GreenProperty = DependencyProperty.Register("Green", typeof(byte), typeof(ColorPickerControl), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnRGBChanged)));
BlueProperty = DependencyProperty.Register("Blue", typeof(byte), typeof(ColorPickerControl), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnRGBChanged)));
}

2.对于依赖属性所注册的名称,也就是对外显示的属性进行get,set设置

        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); }
}

3.属性更改回调方法一个是右边颜色更改的回调,另外一个是三个滑动条的值变化的回调

//颜色变更的回调
private static void OnColorChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
ColorPickerControl pickerControl = (ColorPickerControl)obj;
Color newColor = (Color)e.NewValue;
Color oldColor = (Color)e.OldValue;
pickerControl.Red = newColor.R;
pickerControl.Blue = newColor.B;
pickerControl.Green = newColor.G;
pickerControl.OnColorChange(newColor,oldColor);//这边调用的是第四步的注册事件的方法!!!
}
//三个代表三原色滑动条的回调
private static void OnRGBChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
ColorPickerControl pickerControl = (ColorPickerControl)obj;
Color color = pickerControl.Color;
if (e.Property == RedProperty)
{
color.R = (byte)e.NewValue;
}
else if (e.Property == GreenProperty)
{
color.G = (byte)e.NewValue;
}
else
{
color.B = (byte)e.NewValue;
}
pickerControl.Color = color;
}

4.注册事件,这里主要是颜色变化的时候,修改下面的一个textblock,从而做到显示当前颜色代码的提示

  //注册修改颜色的路由事件
public static readonly RoutedEvent ColorEventRoutedEvent = EventManager.RegisterRoutedEvent("ColorChange",RoutingStrategy.Bubble,typeof(RoutedPropertyChangedEventHandler<Color>),typeof(ColorPickerControl));
//事件包装,移除和添加事件
public event RoutedPropertyChangedEventHandler<Color> ColorChange
{
add { AddHandler(ColorEventRoutedEvent,value); }
remove { RemoveHandler(ColorEventRoutedEvent,value); }
}
private void OnColorChange(Color newColor,Color oldColor)
{
RoutedPropertyChangedEventArgs<Color> args = new RoutedPropertyChangedEventArgs<Color>(newColor,oldColor);
args.RoutedEvent = ColorEventRoutedEvent;
RaiseEvent(args);
}

这里是用户空间的xaml代码

<UserControl x:Class="WpfApp1.UserControls.ColorPickerControl"
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"
d:DesignHeight="300" d:DesignWidth="300"
Name="colorPicker">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Slider Grid.Row="0" Name="RedSilder" Value="{Binding ElementName=colorPicker,Path=Red}" Minimum="0" Maximum="255"/>
<Slider Grid.Row="1" Name="GreenSilder" Value="{Binding ElementName=colorPicker,Path=Green}" Minimum="0" Maximum="255"/>
<Slider Grid.Row="2" Name="BlueSilder" Value="{Binding ElementName=colorPicker,Path=Blue}" Minimum="0" Maximum="255"/>
<Rectangle Grid.Column="1" Grid.RowSpan="3" Stroke="Black" StrokeThickness="1" Width="50">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding ElementName=colorPicker,Path=Color}"/>
</Rectangle.Fill>
</Rectangle>
</Grid>
</UserControl>

最后其他地方添加这个空间的命名空间就可以使用这个控件了!

这里主要是简单的使用了自定义空间的相关知识实现了一个比较简单的功能,wpf的精髓还是太多太多, 自定义控件这样的多元开放的编程实在是有意思。

最新文章

  1. 搭建Nginx+Java环境测试并且运行
  2. Css控制div水平垂直居中显示
  3. 使用Jquery UI 高仿百度搜索下拉列表功能
  4. codeforces gym 100463I Yawner
  5. [欧拉路径]Play on Words UVA10129
  6. ABP 设置默认为中文
  7. Django 执行单独脚本及SyntaxError缩进报错解决
  8. Mysql DBA 运维 MySQL数据库索引优化及数据丢失案例 MySQL备份-增量备份及数据恢复基础实战 MySQL数据库生产场景核心优化
  9. ios-项目启动页面
  10. 1、Ansible简介及简单安装、使用
  11. Code Chef December Challenge 2018题解
  12. Tomcat 服务器开启失败故障
  13. cloudstack-kvm-libvirtd
  14. 妙用Excel数据透视表和透视图向导,将二维数据转换为一维数据
  15. Android笔记——Activity中的回传数据案例(装备选择)
  16. BUAA_OO_电梯系列
  17. 关于meta标签中的http-equiv属性使用介绍
  18. Beyond Compare4.x 破解方案
  19. HDU-1529 Cashier Employment
  20. 走进python

热门文章

  1. intelij Android 搭建 java 项目
  2. flask_restful 学习笔记
  3. Sql Server 里的向上取整、向下取整、四舍五入取整的实例!
  4. MySQL 数据类型和约束(外键是重点&#128580;)
  5. Python3.x 配置原生虚拟环境
  6. Wechat 微信端正确播放audio、video的姿势
  7. linux无密码连接
  8. js调取本地可执行文件exe
  9. 【读书笔记】【深入理解ES6】#9-JavaScript中的类
  10. LeetCode第[15]题(Java):3Sum 标签:Array