2009-02-18 2 views
14

Как я могу получить список всех цветов, которые я могу выбрать в Visual Studio Designer (это System.Windows.Media.Colors, но это не коллекция) и поместить их в мой собственный ComboBox с использованием разметки WPF и XAML?Как я могу перечислить цвета в WPF с помощью XAML?

+0

Подобно предложению CasperOne, вот это путь сделать все это в XAML, с приятным отображением всего в WrapPanel. http://stuff.seans.com/2011/02/14/creating-a-listbox-that-shows-all-predefined-wpf-colors/ –

ответ

31

Вот чистый раствор XAML.

В вашем разделе ресурсов, вы бы использовать это:

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

Или, как CodeNaked points out, она может быть сведена к одному тегу:

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

И тогда выпадающий будет выглядеть следующим образом:

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

@casperOne - Ваше решение можно свести к одной строке: '< ObjectDataProvider ObjectInstance = "{x: Тип Цвета}" MethodName = "GetProperties" x: Ключ = "colorPropertiesOdp" /> '. Этот ответ довольно старый, поэтому, возможно, он не работал в то время. Но я тестировал проект .NET 3.0, 3.5 и 4.0, и он работал каждый раз. – CodeNaked

7

Вот что я сделал в прошлом приложение ASP.net:

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

Описание: Отличный ItemTemplate для использования в combobox с использованием 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

Вот как это делается в коде с использованием отражения. Ниже будет сбрасывать все предопределенный WPF названия цветов для вывода:

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

И поставить их в выпадающем списке, вы можете просто изменить последнюю строку на:

_comboBox.Items.Add(colorsTypePropertyInfo.Name); 
Смежные вопросы