使用 WPF ComboBox 的颜色选择器






4.81/5 (13投票s)
本文将演示如何使用Combobox作为颜色选择器工具,就像Visual Studio中的颜色选择器工具一样。
引言
在Visual Studio和其他工具中,我们发现每当我们为特定元素选择颜色时,都会使用颜色Combobox。本文将指导您创建一个绑定所有系统颜色的Combobox。

背景
假定读者至少是WPF初学者,了解数据绑定技术、依赖属性等基础知识。
Using the Code
颜色集合是从扩展中提取的
<sys:String>System.Windows.Media.Colors, PresentationCore,
Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35</sys:String>
使用的命名空间是
xmlns:sys="clr-namespace:System;assembly=mscorlib"
提取的颜色绑定到ObjectDataProvider
,作为Combobox的数据源。Combobox项目模板分为两个部分,一个用于显示颜色,另一个用于显示颜色名称。Textblock
用于两者,并且颜色的名称绑定到其中一个textblock
的文本属性,而其他textblock
的背景色。selectedvalue
绑定到类型为Brush
的依赖属性“SelectedColor
”。
public Brush SelectedColor
{
get { return (Brush)GetValue(SelectedColorProperty); }
set { SetValue(SelectedColorProperty, value); }
}
// Using a DependencyProperty as the backing store for SelectedColor.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedColorProperty =
DependencyProperty.Register("SelectedColor", typeof(Brush),
typeof(Colorpicker), new UIPropertyMetadata(null));
源代码包含两个XAML文件和CS文件,用于颜色组合框用户控件,以及一个窗口文件,用于操作此用户控件。
Colorpicker.xaml是一个WPF用户控件,XAML代码如下所示
<UserControl x:Class="Customcontrols.Colorpicker"
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"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Height="40" Width="200" Name="uccolorpicker"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ObjectDataProvider MethodName="GetType"
ObjectType="{x:Type sys:Type}" x:Key="colorsTypeOdp">
<ObjectDataProvider.MethodParameters>
<sys:String>System.Windows.Media.Colors, PresentationCore,
Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35</sys:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider ObjectInstance="{StaticResource colorsTypeOdp}"
MethodName="GetProperties" x:Key="colorPropertiesOdp">
</ObjectDataProvider>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<ComboBox Name="superCombo"
ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}"
SelectedValuePath="Name" SelectedValue="{Binding ElementName=uccolorpicker,
Path=SelectedColor}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="20" Height="20" Margin="5"
Background="{Binding Name}"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</UserControl>
Colorpicker.cs是与colorpicker用户控件
关联的CS文件。 在其中,我们创建了一个依赖属性“SelectedColor
”用于设置选定的颜色。 CS文件如下所示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
namespace Customcontrols
{
/// <summary>
/// Interaction logic for Colorpicker.xaml
/// </summary>
public partial class Colorpicker : UserControl
{
public Colorpicker()
{
InitializeComponent();
}
public Brush SelectedColor
{
get { return (Brush)GetValue(SelectedColorProperty); }
set { SetValue(SelectedColorProperty, value); }
}
// Using a DependencyProperty as the backing store for SelectedColor.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedColorProperty =
DependencyProperty.Register("SelectedColor",
typeof(Brush), typeof(Colorpicker), new UIPropertyMetadata(null));
}
}
mainwindow.xaml是一个WPF窗口,它使用colorpicker用户控件
并显示控件选择的颜色,XAML代码如下所示
<Window x:Class="Customcontrols.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="300" Width="600" Name="cc"
xmlns:local="clr-namespace:Customcontrols">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<local:Colorpicker x:Name="superCombo" Grid.Row="0"></local:Colorpicker>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<TextBlock FontWeight="ExtraBlack"
Text="You selected" Height="20" Width="91">
</TextBlock>
<TextBlock Width="100" Height="100"
Background="{Binding ElementName=superCombo, Path=SelectedColor}" >
</TextBlock>
</StackPanel>
</Grid>
</Window>
希望您能理解代码,下载项目并查看。
历史
- 2010年12月30日:初始发布