2009-02-18 17 views
14

Come posso ottenere l'elenco di tutti i colori che posso selezionare in Visual Studio Designer (che è System.Windows.Media.Colors, ma non è una raccolta) e inserirli nel mio ComboBox utilizzando il markup WPF e XAML?Come posso elencare i colori in WPF con XAML?

+0

Simile al suggerimento di CasperOne, ecco un modo per fare tutto in XAML, con una bella visualizzazione di tutto in un WrapPanel. http://stuff.seans.com/2011/02/14/creating-a-listbox-that-shows-all-predefined-wpf-colors/ –

risposta

31

ecco la soluzione XAML puro.

Nella sezione delle risorse, si può usare questa:

<!-- 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, come CodeNaked points out, può essere ridotto a un tag:

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

E poi la casella combinata sarebbe simile a questa:

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

@casperOne - La tua soluzione può essere ridotta a una riga: '< ObjectDataProvider ObjectInstance = "{x: Type Colors}" MethodName = "GetProperties" x: Key = "colorPropertiesOdp" /> '. Questa risposta è abbastanza vecchia, quindi forse non ha funzionato al momento. Ma ho provato con un progetto .NET 3.0, 3.5 e 4.0 e ha funzionato ogni volta. – CodeNaked

7

Ecco quello che ho fatto in un passato 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); 
10

Qui è un grande ItemTemplate da utilizzare per una casella combinata 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

Ecco come farlo nel codice utilizzando la riflessione. Di seguito vi scaricare tutti i nomi dei colori WPF predefiniti di uscita:

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

E per metterli in una casella combinata, si potrebbe semplicemente cambiare l'ultima riga a:

_comboBox.Items.Add(colorsTypePropertyInfo.Name);