很久以前,我看了this MSDN walkthrough。它实现了颜色编辑器,工具提示使用颜色的名称,如“红色”或“蓝色”。
今天,我正在实现类似的ListBox;它会显示一个框,其中包含颜色和旁边颜色的名称。除了在我的应用程序中,所有颜色名称都显示为十六进制值,如#FFFF0000和#FF0000FF。为什么呢?
这是两个项目中使用的ColorsList
类:
public ColorsList()
{
Type type = typeof(Colors);
foreach (PropertyInfo propertyInfo in type.GetProperties(BindingFlags.Public | BindingFlags.Static))
{
if (propertyInfo.PropertyType == typeof(Color))
{
Add((Color)propertyInfo.GetValue(null, null));
}
}
}
此XAML代码段使工具提示使用MSDN项目中的颜色名称(您可以在演练中看到其余代码):
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Tag="{Binding}" Command="{x:Static PropertyEditing:PropertyValueEditorCommands.ShowInlineEditor}">
<Button.Template>
<ControlTemplate>
<Border Width="30" Height="30" BorderBrush="Black" BorderThickness="1" CornerRadius="5">
<Rectangle Width="22" Height="22" ToolTip="{Binding}">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding}"/>
</Rectangle.Fill>
</Rectangle>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
这是我生成十六进制代码的XAML:
<ListBox x:Name="lstColors" Grid.Row="1" ItemsSource="{StaticResource colors}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Stroke="Black"
StrokeThickness="3"
Width="24"
Height="24"
RadiusX="5"
RadiusY="5">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding}" />
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="{Binding}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
对我来说看起来一样;有什么区别?
答案 0 :(得分:1)
不完全是你的问题的答案,更多的是观察:
如果您将ColorsList更改为从ObservableCollection<string>
而不是ObservableCollection<Color>
继承并修改以下行:
Add((Color)propertyInfo.GetValue(null, null));
到
Add(propertyInfo.Name);
您的代码将按您希望的方式运行。而不是将颜色转换为颜色名称,而是使用从颜色名称到颜色的内置转换。
作为旁注,我尝试了MSDN示例中的XAML代码(只是您引用的部分),但工具提示显示颜色代码而不是颜色名称。
答案 1 :(得分:0)
事实证明,设计时与运行时不同。 MSDN示例用作扩展属性编辑器。我接受了朋友的建议并尝试将其暴露为运行时控件,并且神奇地获取颜色的哈希名称而不是友好名称。整齐。