浏览WPF中内置颜色名对应的颜色

学习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

源代码下载

posted on 2011-12-27 19:10  ProJKY  阅读(9633)  评论(2编辑  收藏  举报