创建一个显示所有预定义系统颜色的ListBox

原文 Creating a ListBox that Shows All Predefined System Colors

System.Windows.SystemColors类包含了一系列揭露当前预定义系统颜色静态属性。这些物业有三胞胎。对于每个系统颜色Xxx,有XxxBrushXxxBrushKeyXxxColor属性。

我们可以通过构建一组画笔然后将集合绑定到ListBox,轻松创建一个小的WPF应用程序来显示当前的系统颜色

这是最终结果:

创建一个显示所有预定义系统颜色的ListBox

下面是我用来创建列表的代码。

我从一个包含命名系统颜色及其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>

 

瞧!

 

上一篇:VC/MFC 当鼠标移到控件上时显示提示信息


下一篇:PostgreSQL pg_top pgcenter - 实时top类工具