在开发复杂的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)。