2009-02-18 10 views
14

¿Cómo puedo obtener una lista de todos los colores que puedo elegir en Visual Studio Designer (que es System.Windows.Media.Colors, pero que no es una colección) y ponerlos en mi propio ComboBox usando WPF y XAML?¿Cómo puedo incluir colores en WPF con XAML?

+0

similares a la sugerencia de CasperOne, aquí es una manera para hacerlo todo en XAML, con una buena pantalla de todo en un WrapPanel. http://stuff.seans.com/2011/02/14/creating-a-listbox-that-shows-all-predefined-wpf-colors/ –

Respuesta

31

Aquí está la solución XAML puro.

En su sección de recursos, se utilizaría la siguiente:

<!-- 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> 

O, como CodeNaked points out, puede ser reducido a una etiqueta:

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

Y a continuación, el cuadro combinado se vería así:

<ComboBox Name="comboBox1" 
    ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}" 
    DisplayMemberPath="Name" 
    SelectedValuePath="Name" /> 
+4

@casperOne - Su solución se puede condensar en una sola línea: '< ObjectDataProvider ObjectInstance = "{x: Type Colors}" MethodName = "GetProperties" x: Key = "colorPropertiesOdp" /> '. Esta respuesta es bastante antigua, por lo que tal vez no funcionó en ese momento. Pero probé con un proyecto .NET 3.0, 3.5 y 4.0 y funcionó siempre. – CodeNaked

7

Esto es lo que he hecho en una aplicación ASP.net pasado:

// 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); 
10

Aquí hay una gran ItemTemplate para usar en un combobox usando 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> 
-1

A continuación, se explica cómo hacerlo en código utilizando la reflexión. A continuación se volcará todos los nombres predefinidos de color WPF a la salida:

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

Y para ponerlos en un cuadro combinado, usted puede simplemente cambiar la última línea a:

_comboBox.Items.Add(colorsTypePropertyInfo.Name); 
Cuestiones relacionadas