學習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