原文 Creating a ListBox that Shows All Predefined System Colors
该System.Windows.SystemColors类包含了一系列揭露当前预定义系统颜色静态属性。这些物业有三胞胎。对于每个系统颜色Xxx,有XxxBrush,XxxBrushKey和XxxColor属性。
我们可以通过构建一组画笔然后将集合绑定到ListBox,轻松创建一个小的WPF应用程序来显示当前的系统颜色。
这是最终结果:
下面是我用来创建列表的代码。
我从一个包含命名系统颜色及其Brush的实用程序类开始:
public class ColorInfo { public string Name { get; set; } public Brush Brush { get; set; } public ColorInfo(string name, Brush brush) { Name = name; Brush = brush; } }
接下来,我将一个集合添加到我的主Window类,它将存储一个ColorInfo对象列表:
private ObservableCollection<ColorInfo> allSystemColors; public ObservableCollection<ColorInfo> AllSystemColors { get { return allSystemColors; } }
在窗口的构造函数中,我使用反射填充此列表。请注意,我遍历SystemColors类中的所有属性,只抓取名称以“Brush”结尾的那些属性。
allSystemColors = new ObservableCollection<ColorInfo>(); Type scType = typeof(SystemColors); foreach (PropertyInfo pinfo in scType.GetProperties()) { if (pinfo.Name.EndsWith("Brush")) allSystemColors.Add(new ColorInfo(pinfo.Name.Remove(pinfo.Name.Length - 5), (Brush)pinfo.GetValue(null, null))); }
剩下的就是将此集合绑定到ListBox。我们在XAML中这样做:
<ListBox ItemsSource="{Binding ElementName=mainWindow, Path=AllSystemColors}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" > <ListBox.ItemsPanel> <ItemsPanelTemplate> <WrapPanel /> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical"> <Rectangle Fill="{Binding Path=Brush}" Stroke="Black" Margin="5" StrokeThickness="1" Height="74" Width="120"/> <TextBlock Text="{Binding Path=Name}" HorizontalAlignment="Center"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
瞧!