C# 使用SolidColorBrush笔刷填充列表

C# 使用SolidColorBrush笔刷填充列表,c#,windows-phone-7,xaml,C#,Windows Phone 7,Xaml,我试图用WP7.1中提供的所有预定义SolidColorBrush填充列表,但通过代码执行此操作时遇到问题。我已经用一个测试颜色的简短列表手动完成了这项工作,它工作正常,但是有超过一百种不同的预定义颜色,我知道必须有一个正确的方法,尽管我不确定如何完成这项工作。到目前为止,我掌握的情况如下 MainPage.xaml <ScrollViewer> <!--<toolkit:MultiselectList x:Name="ColorList" Ite

我试图用WP7.1中提供的所有预定义SolidColorBrush填充列表,但通过代码执行此操作时遇到问题。我已经用一个测试颜色的简短列表手动完成了这项工作,它工作正常,但是有超过一百种不同的预定义颜色,我知道必须有一个正确的方法,尽管我不确定如何完成这项工作。到目前为止,我掌握的情况如下

MainPage.xaml

<ScrollViewer>
            <!--<toolkit:MultiselectList x:Name="ColorList" ItemsSource="{Binding}" Height="88" HorizontalAlignment="Left" VerticalAlignment="Top" >-->
            <toolkit:MultiselectList x:Name="ColorList" HorizontalAlignment="Left" VerticalAlignment="Top" Tap="ColorList_Tap">
                <toolkit:MultiselectList.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="12,12,0,0" Grid.ColumnSpan="2">
                            <Rectangle Fill="{Binding Brush}" Width="50" Height="50"/>
                            <TextBlock Text="{Binding Name}" Margin="12,10,0,0"/>
                        </StackPanel>
                    </DataTemplate>
                </toolkit:MultiselectList.ItemTemplate>


            </toolkit:MultiselectList>
        </ScrollViewer>

MainPage.xaml.cs

    List<ColorItem> solidColorBrushList;

    public ColorListPage()
    {
        InitializeComponent();

        solidColorBrushList = new List<ColorItem>()
        {
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,27,161,226)), Name = "blue" },     
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,160,80,0)), Name = "brown" },      
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255, 51,153,51)), Name = "green" },    
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,162,193,57)), Name = "lime" },    
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,216,0,115)), Name = "magenta" },  
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,240,150,9)), Name = "mango" },    
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,230,113,184)), Name = "pink" },   
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,162,0,255)), Name = "purple" },   
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,229,20,0)), Name = "red" },       
            new ColorItem { Brush = new SolidColorBrush(Color.FromArgb(255,0,171,169)), Name = "teal" }
        };

        this.ColorList.ItemsSource = solidColorBrushList;

        this.Loaded += new RoutedEventHandler(ColorListPage_Loaded);
    }

    void ColorListPage_Loaded(object sender, RoutedEventArgs e)
    {
        //show checkboxes when page is loaded
        this.ColorList.IsSelectionEnabled = true;
    }
}

public class ColorItem
{
    public SolidColorBrush Brush { get; set; }
    public string Name { get; set; }
}
List-solidColorBrushList;
公共ColorListPage()
{
初始化组件();
solidColorBrushList=新列表()
{
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255,27161226)),Name=“blue”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255160,80,0)),Name=“brown”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255,51153,51)),Name=“green”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255162193,57)),Name=“lime”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255216,0115)),Name=“magenta”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255240150,9)),Name=“mango”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(25523011184)),Name=“pink”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255162,0255)),Name=“purple”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255229,20,0)),Name=“red”},
new ColorItem{Brush=new SolidColorBrush(Color.FromArgb(255,0171169)),Name=“teal”}
};
this.ColorList.ItemsSource=solidColorBrushList;
this.Loaded+=新的RoutedEventHandler(ColorListPage_-Loaded);
}
已加载void ColorListPage_(对象发送方,路由目标)
{
//加载页面时显示复选框
this.ColorList.IsSelectionEnabled=true;
}
}
公共类颜色项
{
公共SolidColorBrush笔刷{get;set;}
公共字符串名称{get;set;}
}
调用所有画笔及其各自的名称来填充multiselectlist的正确方法是什么?
另外,作为旁注,由于某种原因,我的多选列表在页面中显示时会切断文本,有没有办法将列表拉伸到屏幕的宽度,这样矩形和文本都可以显示而不被切断?

您可以使用反射来拉出
颜色中的所有
颜色
条目,并用它们构建笔刷

你得原谅我,我目前没有访问Visual Studio的权限,所以我在记事本中把API从我的头顶上去掉

List<ColorItem> solidColorBrushList = new List<ColorItem>();

PropertyInfo[] colorProperties = typeof(Colors).GetProperties(BindingFlags.Public | BindingFlags.Static)
foreach (PropertyInfo colorProperty in colorProperties)
{
    //could probably omit this check; I think all static properties of Colors are of type Color
    if (colorProperty.PropertyType == typeof(Color))
    {
        Color color = (Color)colorProperty.GetValue(null, null);
        string colorName = colorPropertyName;
        SolidColorBrush brush = new SolidColorBrush(color);

        ColorItem item = new ColorItem() { Brush = brush, Name = colorName };
        solidColorBrushList.Add(item);
    }
}

我的答案与Chris的大致相同,但我认为值得发布,因为我将我的答案归结为一条声明(删除它似乎很遗憾):

编辑:包括Chris的建议:

var colors = typeof(Colors)
    .GetProperties(BindingFlags.Static | BindingFlags.Public)
    .Select(p => new ColorItem()
                 {
                     Name = p.Name,
                     Brush = new SolidColorBrush((Color)p.GetValue(null, null))
                 }
           ).ToList();

为了补充Penguin先生的答案,这将ColorCode列为字符串值,可以像颜色名称本身一样进行转换(
ColorConverter.ConvertFromString(…)
)。以下是Linqpad输出:

typeof(Colors)
    .GetProperties(BindingFlags.Static | BindingFlags.Public)
    .Select(p => new
    {
        Name = p.Name,
        Brush = new SolidColorBrush((Color)p.GetValue(null, null)),
    })
    .Select(p => new { p.Name, ColorCode = p.Brush.ToString(), p.Brush})
.Dump();

总有一天,我真的要一头扎进林克+老师们:)这绝对值得。当我现在不能使用它们时,我感到很沮丧。你能用
.Select(p=>new ColorItem(){Name=p.Name,Brush=new SolidColorBrush((Color)p.GetValue(null,null))}
而不是
ToDictionary
来获取他的数据类型吗?当然,这是一个很好的方法。但是需要注意的一件事是在任何类似这样的语句的末尾添加ToList()、ToArray()等调用,否则每次使用集合时都会重新计算.Select(…)。如果您希望列表中的对象稍后仍在列表中,则此操作可能会很慢,并导致一些意外的副作用。您的解决方案有效,但只填充了大约10种预定义颜色。据我所知,有100多个预定义的颜色选项,我在尝试从xaml手动填充矩形时可以看到这些选项。我如何访问所有这些颜色?啊,这是因为它适用于Silverlight(Windows phone),对吗?Silverlight的System.Windows.Media.Colors类只有十几种颜色(别问我为什么),而完整的.NET4.0有一种颜色。查看您链接的页面的Silverlight版本:那么您如何解决这个问题呢?也许正是你所做的重新定义了每一个可能得咬紧牙关了。DLL不兼容,抱歉。我认为最好的办法可能是咬紧牙关,创建自己的静态类,并使用您想要包含的只读颜色。在这种情况下,我会使用LINQPad(尽管VS也可以)为我打印代码。参考WPF PresentationCore并运行此代码,然后循环并输出“new ColorItem(…Color.FromArgb(…,…,…'行,用您的颜色代码替换FromArgb参数。@Matthew我发布了我们在工作中创建的类,该类复制了完整的.NET 4.0颜色,以防您还没有这样做;也许这会节省您一些时间。谢谢您的提示!我确实对@Chris关于访问所有预定义颜色的解决方案有另一个问题,我n而不是只填充了大约10个多选列表。您知道如何获得如图所示的整个列表吗
var colors = typeof(Colors)
    .GetProperties(BindingFlags.Static | BindingFlags.Public)
    .Select(p => new ColorItem()
                 {
                     Name = p.Name,
                     Brush = new SolidColorBrush((Color)p.GetValue(null, null))
                 }
           ).ToList();
typeof(Colors)
    .GetProperties(BindingFlags.Static | BindingFlags.Public)
    .Select(p => new
    {
        Name = p.Name,
        Brush = new SolidColorBrush((Color)p.GetValue(null, null)),
    })
    .Select(p => new { p.Name, ColorCode = p.Brush.ToString(), p.Brush})
.Dump();