C# 如何使用 XAML 在 WPF 中列出颜色?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/562682/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-04 08:16:55  来源:igfitidea点击:

How can I list colors in WPF with XAML?

c#wpfxaml

提问by

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 own ComboBoxusing WPF and XAML markup?

如何获取我可以在 Visual Studio 设计器中选择的所有颜色的列表(它是System.Windows.Media.Colors,但不是一个集合),并ComboBox使用 WPF 和 XAML 标记将它们放入我自己的列表中?

采纳答案by casperOne

Here is the pure XAML solution.

这是纯 XAML 解决方案。

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:

或者,正如CodeNaked 指出的那样,它可以简化为一个标签:

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

回答by Ronnie Overby

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

这是我在过去的 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);

回答by Max

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

这是一个很棒的 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>

回答by Eternal21

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

下面是如何使用反射在代码中做到这一点。以下将转储所有预定义的 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);
}

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

要将它们放在组合框中,您只需将最后一行更改为:

_comboBox.Items.Add(colorsTypePropertyInfo.Name);