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

15 c# wpf xaml

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

cas*_*One 33

这是纯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>
Run Code Online (Sandbox Code Playgroud)

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

<ObjectDataProvider 
    ObjectInstance="{x:Type Colors}" 
    MethodName="GetProperties" 
    x:Key="colorPropertiesOdp" />
Run Code Online (Sandbox Code Playgroud)

然后组合框看起来像这样:

<ComboBox Name="comboBox1" 
    ItemsSource="{Binding Source={StaticResource colorPropertiesOdp}}"
    DisplayMemberPath="Name"
    SelectedValuePath="Name" />
Run Code Online (Sandbox Code Playgroud)

  • @casperOne - 您的解决方案可以缩减为一行:`<ObjectDataProvider ObjectInstance ="{x:Type Colors}"MethodName ="GetProperties"x:Key ="colorPropertiesOdp"/>`.这个答案相当陈旧,所以也许它当时不起作用.但我测试了.NET 3.0,3.5和4.0项目,它每次都有效. (5认同)

小智 11

这是一个很棒的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>
Run Code Online (Sandbox Code Playgroud)


Ron*_*rby 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);
Run Code Online (Sandbox Code Playgroud)