学习WPF一段时间了,对于里面内置的颜色仅记得几种,相对于里面丰富的颜色来说,极大的限制了使用WPF过程中的选择.
通常,使用Xaml语言,会根据属性类型自动调用相应的转换器,转换为需要的类型值. 如果要查看所有的颜色, 需要枚举和转换, 并显示出来。
先看一个《WPF Unleashed》中介绍的例子:
System.Windows.Controls.Button b = new System.Windows.Controls.Button();
b.Content = "OK";
b.Background = (Brush)System.ComponentModel.TypeDescriptor.GetConverter(
typeof(Brush)).ConvertFromInvariantString("White");
那么,如果我们只要知道了所有的颜色名,就可以得到对应的颜色了。而.NET中的System.Windows.Media.Colors类包含了所有的颜色名,可以使用反射得到所有的颜色名。
代码参见:
// 取得保存颜色命名的类类型
Type colorType = typeof(Colors);
// 利用反射,得到所有颜色
var colorNames = from MemberInfo color in colorType.GetMembers()
where color.MemberType == MemberTypes.Property
select color.Name;
下一步,就是迭代颜色名,转换为Color类实例,并显示出颜色来了。
代码参见:
// 通过类型转换和颜色名,得到对应颜色实例
var colorColl = from name in colorNames
let color = (Color)TypeDescriptor.
GetConverter(typeof(Color)).
ConvertFromInvariantString(name)
select new { Name = name, Color = color };
// 通过设置TextBlock,显示所有颜色
var textblocks = from color in colorColl
select new TextBlock()
{
Text = color.Name,
Background = new SolidColorBrush(color.Color)
};
// 增加一个边框,突出背景色
var borders = from textblock in textblocks
select new Border
{
BorderThickness = new Thickness(5),
Child = textblock
};
// 显示所有颜色名,和对应颜色
foreach (var border in borders)
{
drawPanel.Children.Add(border);
}
所对应的XAML代码:
<Window x:Class="ColorShowcase.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="显示不同的内置颜色" Width="690" Height="500" Loaded="Window_Loaded">
<ScrollViewer>
<WrapPanel Name="drawPanel"/>
</ScrollViewer>
</Window>
程序运行截图:
程序编译环境 VS2010 + .NET 4 + WPF