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