Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

WPF Color Palette

0.00/5 (No votes)
10 Jul 2008 1  
Show WPF brushes in a ListBox.

Introduction

This simple application lists brushes in System.Windows.Media.Brushes in a ListBox by using Reflection and the WPF Data Binding features.

Using the code

First, add a ListBox and set a DataTemplate in the ItemTemplate attribute:

<!-- Don't forget to set ItemsSource as {Binding} -->
<ListBox Name="lsbBrushes" ItemsSource="{Binding}" Margin="10"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <!-- Context Menu -->
    <ListBox.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Copy Name" Click="CopyName_Click"></MenuItem>
            <MenuItem Header="Copy Hex" Click="CopyHex_Click"></MenuItem>
        </ContextMenu>
    </ListBox.ContextMenu>
    <!-- Item Panel Template just for show items in warp mode -->
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <!-- Items Data Template -->
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition Width="130"/>
                </Grid.ColumnDefinitions>
                <Rectangle Fill="{Binding Path=Name}" 
                    Stroke="Black" Margin="5"
                    StrokeThickness="1" Height="50" Width="100"/>
                <StackPanel Grid.Column="1">
                    <Label Content="{Binding Path=Name}" />
                    <Label Content="{Binding Path=Hex}" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

And now, write the binding class and item class like this:

// Binding Class
class WPFBrushList : List<WPFBrush>
{
    public WPFBrushList()
    {
        // Get type of the Brushes
        Type BrushesType = typeof(Brushes);
        // Get properties of this type
        PropertyInfo[] brushesProperty = BrushesType.GetProperties();
        // Extract Name and Hex code and add to list (binding class)
        foreach (PropertyInfo property in brushesProperty)
        {
            BrushConverter brushConverter = new BrushConverter();
            Brush brush = (Brush)brushConverter.ConvertFromString(property.Name);
            Add(new WPFBrush(property.Name, brush.ToString()));
        }
    }
}

// Item Class
class WPFBrush
{
    public WPFBrush(string name, string hex) 
    {
        Name = name;
        Hex = hex;
    }
    //please note name of properties are same as DataTemplate Binding Paths 
    public string Name { get; set; }
    public string Hex { get; set; }
}

At last, set the binding class to ListBox.DataContext:

public partial class Window1 : Window
{
    // Create binding object
    private WPFBrushList _brushes = new WPFBrushList();
    public Window1()
    {
        InitializeComponent();
        // Bind to ListBox
        lsbBrushes.DataContext = _brushes;
    }
    // Copy selected to Clipboard
    private void CopyName_Click(object sender, RoutedEventArgs e)
    {
        if (lsbBrushes.SelectedIndex != -1)
            Clipboard.SetText(((WPFBrush)lsbBrushes.SelectedItem).Name);
    }
    private void CopyHex_Click(object sender, RoutedEventArgs e)
    {
        if (lsbBrushes.SelectedIndex != -1)
            Clipboard.SetText(((WPFBrush)lsbBrushes.SelectedItem).Hex);
    }
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here