文章目录

  • 前言
  • 一、如何实现?
    • 1、使用ObjectDataProvider
    • 2、定义转换器
    • 3、绑定容器
  • 二、使用示例
    • 1.代码
    • 2.显示效果
  • 总结

前言

wpf本身没有提供颜色板之类的控件,有些业务使用场景需要使用颜色板之类的控件,比如设置弹幕的颜色或设置文本的颜色等。这里提供一种颜色板的简单实现方法。


一、如何实现?

1、使用ObjectDataProvider

ObjectDataProvider是wpf中xaml绑定.net任意t类型的媒介,通过ObjectDataProvider可以直接获取到System.Windows.Media.Brushes类的属性列表。System.Windows.Media.Brushes中定义了常见的颜色刷子。

2、定义转换器

由于ObjectDataProvider获取的Brushes属性集合是反射集合,并不是直接的Brush对象,所以需要进行数据的转换,定义一个转换器,将属性(PropertyInfo)转换成Brush对象。

3、绑定容器

绑定容器的ItemsSource属性并使用上述的转换器,通过定义ItemTemplate自定义颜色的显示控件。

二、使用示例

本示例使用的是ComboBox作为容器显示颜色板。

1.代码

xaml代码如下(示例):

<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:local="clr-namespace:WpfApp1"     mc:Ignorable="d"Title="MainWindow" Height="720" Width="1280"><Window.Resources><ResourceDictionary><ObjectDataProvider    ObjectInstance="{x:Type Brushes}"    MethodName="GetProperties"    x:Key="Brushes" /><local:BrushTypeConverter  x:Key="BrushTypeConverter"></local:BrushTypeConverter></ResourceDictionary></Window.Resources><Grid><ComboBox Margin="0,-200,0,0"  Width="240" Height="60" ItemsSource="{Binding Source={StaticResource Brushes}}"     SelectedItem="{Binding  ForeColor}"><ComboBox.ItemContainerStyle><Style TargetType="ComboBoxItem"><Setter Property="Template" ><Setter.Value><ControlTemplate TargetType="ComboBoxItem"><Rectangle Width="210"  Height="46" Margin="2,2,2,2" Stroke="#cccccc" StrokeThickness="1" RadiusX="5"   RadiusY="5"  Fill="{Binding RelativeSource={x:Static RelativeSource.Self},Path=DataContext,Converter={StaticResource BrushTypeConverter}}"></Rectangle></ControlTemplate></Setter.Value></Setter></Style></ComboBox.ItemContainerStyle><ComboBox.Template><ControlTemplate  TargetType="ComboBox"><Grid><ToggleButton  Cursor="Hand" BorderThickness="0"  BorderBrush="Transparent"  Panel.ZIndex="1"     IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"><ToggleButton.Template><ControlTemplate><StackPanel Orientation="Horizontal" Background="Transparent"><Rectangle Width="210" Height="46" Margin="7,0,5,0"   Stroke="#cccccc" StrokeThickness="1" RadiusX="5"   RadiusY="5"  Fill="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}},Converter={StaticResource BrushTypeConverter}}"></Rectangle><Polyline  Grid.Column="1"  Points="0,0 5,6 10,0"   Margin="0,0,10,0"   Width="10"  Height="6"  Stretch="Fill"  Stroke="Black"  StrokeThickness="1" /></StackPanel></ControlTemplate></ToggleButton.Template></ToggleButton><Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide"><Border CornerRadius="1" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True"><ScrollViewer Margin="4,6,4,6"  MaxHeight="{TemplateBinding MaxDropDownHeight}" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True"><!--StackPanel 用于显示子级,方法是将 IsItemsHost 设置为 True--><StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" Background="White"/></ScrollViewer></Border></Popup></Grid></ControlTemplate></ComboBox.Template></ComboBox></Grid>
</Window>

转换器代码如下(示例):

    public class BrushTypeConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){if (value == null)return null;PropertyInfo propertyInfo = value as PropertyInfo;return propertyInfo.GetValue(value) as SolidColorBrush;}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){return null;}}

2.显示效果

效果如下(示例):


总结

这种方法实现颜色板比较简单,而且效果也不错,当然也仅限于颜色板,不能实现调色板。但总体来说是一种比较不错的实现方案。

C# wpf 实现简单的颜色板相关推荐

  1. Unity 颜色板|调色板|无级变色功能

    效果 Unity 通过UGUI实现无级变色的调色板功能,非常的简单好用. 项目git地址 https://github.com/zrzhang76/UnityColorBoard 代码(写这个完全是因 ...

  2. WPF MvvmLight简单实例(1) 页面导航

    原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击"Load"按钮,页面会加载PageOne,点击PageOne ...

  3. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...

    WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...

  4. WPF绘制简单常用的Path

    原文:WPF绘制简单常用的Path 写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比 ...

  5. matplotlib 颜色板

    matplotlib 颜色板(color) plot(color = "")

  6. WPF 最简单的TextBox水印

    WPF 最简单的TextBox水印 最简单的TextBox加水印的方法,但是不具有很强的通用性. 如果你只是使用一次,或者用的不多,偷偷懒可以使用. 因为此方法只需要修改TextBox的Templat ...

  7. 【写笔记】WPF 自定义简单的TextBox控件

    效果图: 笔记分享: https://www.yuque.com/docs/share/4aac743b-1ff0-42d2-9ec3-c605c145a58e?# <WPF 自定义简单的Tex ...

  8. WPF实现简单的颜色调色板功能

    Winform有自带的ColorDialog功能,WPF可以通过引用System.Windows.Forms的方式来创建调色板,在这里仅使用Canvas等控件来实现简单的调色板.效果如下: gif录制 ...

  9. WPF DataGrid简单使用

    1.创建 DataGrid <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin=& ...

最新文章

  1. ubuntu18.04下双机驱动调试
  2. 关注这些技术号,你将拥有半个互联网圈
  3. python利用什么写模板_Python利用逻辑回归分类实现模板
  4. 特征选择与特征权重区别
  5. 互联网1分钟 |1127
  6. 《Netty权威指南》
  7. ReentrantLock可重入锁使用及原理
  8. Redis笔记4-持久化方案
  9. Struts2中EL表达式的取值范围问题
  10. 高薪必备|Redis 基础、高级特性与性能调优
  11. 你手中的iPhone 7已过时!被苹果列为清仓产品,或为iPhone SE2让路
  12. 超级无敌数字加密算法
  13. 数据库表之间的数据导入 sql语句
  14. 为什么游戏加速器都会设置韩国节点
  15. python怎么把数据导入excel_如何把python中的数据导入excel
  16. 安装IDEA 并创建快捷方式
  17. 干货,值得收藏!Python 操作 Excel 报表自动化指南!
  18. 我的世界服务器信号下面是红,适用于服务器的红石抽奖机我的世界抽奖机电路图...
  19. 中国高空作业平台何时摆脱外国的影子
  20. 判断输出,输入0,1,2,3,输出aaaa,bbbbb,cccc,dddd(c语言)

热门文章

  1. SourceTree跳过Bitbucket服务器或者Bitbucket登录的方法
  2. 车载以太网 - SomeIP - 详细解析 - 02
  3. 基于ROS的qbo机器人
  4. 两种图像拼接(无重叠相邻图有重叠相邻图)以及matlab实现(边线查找法)
  5. vins-fusion代码解读[五] imu在vins里的理解
  6. 从事非标自动化行业的难度很大?为什么?你知道吗?
  7. Nginx服务器概述
  8. spring原理 struts2原理 hibernate原理 MyBatis原理 SpringMVC
  9. Linux ls命令大全
  10. python(64位)安装超详细