65.9K
CodeProject is changing. Read more.
Home

WPF Color Palette

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (12 votes)

Jul 10, 2008

CPOL
viewsIcon

73341

downloadIcon

2619

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);
    }
}