Как я могу перечислить цвета в WPF с XAML? - PullRequest
14 голосов
/ 18 февраля 2009

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

Ответы [ 4 ]

31 голосов
/ 19 февраля 2009

Вот чистое решение 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 , его можно уменьшить до одного тега:

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

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

<ComboBox Name="comboBox1" 
    ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}"
    DisplayMemberPath="Name"
    SelectedValuePath="Name" />
10 голосов
/ 05 января 2011

Вот отличный шаблон ItemTemplate, который можно использовать для комбинированного списка, используя код casperOne :

<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>
7 голосов
/ 18 февраля 2009

Вот что я сделал в прошлом приложении 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);
0 голосов
/ 13 ноября 2014

Вот как это сделать в коде с помощью отражения. Следующее будет выводить все предопределенные имена цветов WPF в 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);
}

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

_comboBox.Items.Add(colorsTypePropertyInfo.Name); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...