How can I list colors in WPF with XAML?

前端 未结 4 899
耶瑟儿~
耶瑟儿~ 2020-12-05 08:14

How can I get list of all colors I can pick in Visual Studio Designer (which is System.Windows.Media.Colors, but that isn\'t a collection) and put them into my

相关标签:
4条回答
  • 2020-12-05 08:30

    Here's how to do it in code using reflection. The following will dump all predefined WPF color names to Output:

    using System.Reflection;
    
    void ListAllColors()
    {
        Type colorsType = typeof(System.Windows.Media.Colors);
        PropertyInfo[] colorsTypePropertyInfos = colorsType.GetProperties(BindingFlags.Public | BindingFlags.Static);
    
        foreach (PropertyInfo colorsTypePropertyInfo in colorsTypePropertyInfos)
            Debug.WriteLine(colorsTypePropertyInfo.Name);
    }
    

    And to put them in a combobox, you could simply change the last line to:

    _comboBox.Items.Add(colorsTypePropertyInfo.Name); 
    
    0 讨论(0)
  • 2020-12-05 08:38

    Here is a great ItemTemplate to use for a combobox using casperOne's code:

    <ComboBox Name="cboColors"
              ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}"
              SelectedValuePath="Name">
         <ComboBox.ItemTemplate>
            <DataTemplate>
               <StackPanel Orientation="Horizontal" Height="18" Margin="0,0,0,2">
                  <Border BorderThickness="1" CornerRadius="2" 
                      BorderBrush="Black" Width="50" VerticalAlignment="Stretch"
                      Background="{Binding Name}"/>
                  <TextBlock Text="{Binding Name}" Margin="8,0,0,0"/>
               </StackPanel>
             </DataTemplate>
         </ComboBox.ItemTemplate>
    </ComboBox>
    
    0 讨论(0)
  • 2020-12-05 08:43

    Here is what I have done in a past ASP.net app:

    // populate colors drop down (will work with other kinds of list controls)
    Type colors = typeof(System.Drawing.Color);
    PropertyInfo[] colorInfo = colors.GetProperties(BindingFlags.Public |
        BindingFlags.Static);
    foreach ( PropertyInfo info in colorInfo)
    {
        ddlColor.Items.Add(info.Name);                
    }
    
    // Get the selected color
    System.Drawing.Color selectedColor = 
        System.Drawing.Color.FromName(ddlColor.SelectedValue);
    
    0 讨论(0)
  • 2020-12-05 08:52

    Here is the pure XAML solution.

    In your resources section, you would use this:

    <!-- Make sure this namespace is declared so that it's in scope below -->
    .. xmlns:sys="clr-namespace:System;assembly=mscorlib" ..
    
    <ObjectDataProvider MethodName="GetType" 
        ObjectType="{x:Type sys:Type}" x:Key="colorsTypeOdp">
        <ObjectDataProvider.MethodParameters>
            <sys:String>System.Windows.Media.Colors, PresentationCore,
                Version=3.0.0.0, Culture=neutral, 
                PublicKeyToken=31bf3856ad364e35</sys:String>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    <ObjectDataProvider ObjectInstance="{StaticResource colorsTypeOdp}"  
        MethodName="GetProperties" x:Key="colorPropertiesOdp">
    </ObjectDataProvider>
    

    Or, as CodeNaked points out, it can be reduced to one tag:

    <ObjectDataProvider 
        ObjectInstance="{x:Type Colors}" 
        MethodName="GetProperties" 
        x:Key="colorPropertiesOdp" />
    

    And then the combobox would look like this:

    <ComboBox Name="comboBox1" 
        ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}"
        DisplayMemberPath="Name"
        SelectedValuePath="Name" />
    
    0 讨论(0)
提交回复
热议问题