C# wpf 实现简单的颜色板
文章目录
- 前言
- 一、如何实现?
- 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 实现简单的颜色板相关推荐
- Unity 颜色板|调色板|无级变色功能
效果 Unity 通过UGUI实现无级变色的调色板功能,非常的简单好用. 项目git地址 https://github.com/zrzhang76/UnityColorBoard 代码(写这个完全是因 ...
- WPF MvvmLight简单实例(1) 页面导航
原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击"Load"按钮,页面会加载PageOne,点击PageOne ...
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...
WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...
- WPF绘制简单常用的Path
原文:WPF绘制简单常用的Path 写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比 ...
- matplotlib 颜色板
matplotlib 颜色板(color) plot(color = "")
- WPF 最简单的TextBox水印
WPF 最简单的TextBox水印 最简单的TextBox加水印的方法,但是不具有很强的通用性. 如果你只是使用一次,或者用的不多,偷偷懒可以使用. 因为此方法只需要修改TextBox的Templat ...
- 【写笔记】WPF 自定义简单的TextBox控件
效果图: 笔记分享: https://www.yuque.com/docs/share/4aac743b-1ff0-42d2-9ec3-c605c145a58e?# <WPF 自定义简单的Tex ...
- WPF实现简单的颜色调色板功能
Winform有自带的ColorDialog功能,WPF可以通过引用System.Windows.Forms的方式来创建调色板,在这里仅使用Canvas等控件来实现简单的调色板.效果如下: gif录制 ...
- WPF DataGrid简单使用
1.创建 DataGrid <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin=& ...
最新文章
- ubuntu18.04下双机驱动调试
- 关注这些技术号,你将拥有半个互联网圈
- python利用什么写模板_Python利用逻辑回归分类实现模板
- 特征选择与特征权重区别
- 互联网1分钟 |1127
- 《Netty权威指南》
- ReentrantLock可重入锁使用及原理
- Redis笔记4-持久化方案
- Struts2中EL表达式的取值范围问题
- 高薪必备|Redis 基础、高级特性与性能调优
- 你手中的iPhone 7已过时!被苹果列为清仓产品,或为iPhone SE2让路
- 超级无敌数字加密算法
- 数据库表之间的数据导入 sql语句
- 为什么游戏加速器都会设置韩国节点
- python怎么把数据导入excel_如何把python中的数据导入excel
- 安装IDEA 并创建快捷方式
- 干货,值得收藏!Python 操作 Excel 报表自动化指南!
- 我的世界服务器信号下面是红,适用于服务器的红石抽奖机我的世界抽奖机电路图...
- 中国高空作业平台何时摆脱外国的影子
- 判断输出,输入0,1,2,3,输出aaaa,bbbbb,cccc,dddd(c语言)