在开发复杂的Silverlight应用程序时,经常需要自定义一些控件以满足特定的需求。本文将介绍如何创建一个具有下拉颜色选择功能的颜色选择器控件,类似于Visual Studio 2010属性浏览器中使用的颜色选择器。
首先,需要明确想要的颜色选择器控件应该具有哪些特性。希望它能够像ComboBox或DatePicker那样易于使用,用户可以预定义颜色或自定义颜色。然而,市场上现有的颜色选择器控件要么不完美,要么不符合需求,因此决定自己创建一个。
非常喜欢Visual Studio 2010属性浏览器中的颜色选择器,因此创建了一个类似的控件。这个颜色选择器的使用非常简单:
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void colorPicker1_ColorChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (colorPicker1 != null)
{
MessageBox.Show(colorPicker1.Color.ToString());
}
}
}
在XAML文件中,定义了颜色选择器控件,并为其设置了一些基本属性,如高度、水平和垂直对齐方式、边距以及颜色和颜色更改事件。
<UserControl x:Class="SilverlightControls.MainPage"
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:mine="clr-namespace:SilverlightControls"
mc:Ignorable="d"
d:DesignHeight="400"
d:DesignWidth="600">
<Grid x:Name="LayoutRoot" Background="White">
<mine:ColorPicker Height="23" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,50" x:Name="colorPicker1" Width="150" Color="Red" ColorChanged="colorPicker1_ColorChanged">
</mine:ColorPicker>
</Grid>
</UserControl>
关于颜色选择器的下拉部分,将其命名为ColorBoard。ColorBoard由三部分组成:
第一部分:左上角是HSV部分; 第二部分:右上角是ARGB部分; 第三部分:底部是预定义颜色部分,这是一个ComboBox。当前的顺序是Windows默认顺序。如果想使用字母顺序,可以在PredefinedColor.cs文件中注释掉第26行,取消注释第29行。
在PredefinedColor.cs文件中,定义了一些预定义的颜色。例如,“Aqua”和“Cyan”是相同的颜色(0xFF00FFFF),“Fuchsia”和“Magenta”是相同的颜色(0xFFFF00FF)。
绘制S-V矩形是最具挑战性的问题。曾长时间为此困扰。设置每个点的颜色?不,那太愚蠢了。最后,找到了解决方案:使用两个LinearGradientBrush。一个水平方向用于饱和度(S),另一个垂直方向用于值(V)。