问题描述
||
到目前为止,这是我尝试根据数据绑定对象的int值在列表框项目(列表)中实现渐变背景的方法
我的对象具有简化形式:
public class Item {
public string name { get; set; }
public string address { get; set; }
public int highlight { get; set; }
}
转换器尝试:
使用此转换器:
public class BusinessTypetoBackgroundConverter : IValueConverter
{
private static readonly LinearGradientBrush normalBkg = new LinearGradientBrush
{
StartPoint = new Point(0,0),EndPoint = new Point(0,1),GradientStops = new GradientStopCollection
{
new GradientStop {Color = Util.GetColorFromHex(\"#4ce6e6e6\")},new GradientStop {Color = Util.GetColorFromHex(\"#ffe6e6e6\")}
}
};
private static readonly LinearGradientBrush HighlightedBkg = new LinearGradientBrush
{
StartPoint = new Point(0,GradientStops = new GradientStopCollection
{
new GradientStop {Color = Util.GetColorFromHex(\"#4cffffcc\")},new GradientStop {Color = Util.GetColorFromHex(\"#ffffffcc\")}
}
};
public object Convert(object value,Type targettype,object parameter,CultureInfo culture)
{
switch ((int)value)
{
case 1:
return HighlightedBkg;
case 2:
return normalBkg;
default:
return normalBkg;
}
}
public object ConvertBack(object value,CultureInfo culture)
{
throw new NotImplementedException(\"BusinessTypetoBackgroundConverter ConvertBack Method Not Implemented\");
}
}
而这个项目模板
<ListBox
Name=\"lstResults\"
ItemContainerStyle=\"{StaticResource ListBoxItemStyle1}\">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Background=\"{Binding highlight,Converter={StaticResource myConverter}}\">
<StackPanel>
<TextBlock Text=\"{Binding name}\" textwrapping=\"Wrap\" FontSize=\"24\" FontWeight=\"Bold\" Foreground=\"Black\"/>
<TextBlock Text=\"{Binding address}\" textwrapping=\"Wrap\" FontSize=\"24\" Foreground=\"Black\" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
尝试背后的代码
向我的Item对象添加了“ LinearGradientBrush背景”属性
public LinearGradientBrush background
{
get
{
if (highlight == 1) return HighlightedBkg;
else return normalBkg;
}
}
在这两种情况下,仅将“渐变”的“开始”颜色应用于listItem(网格背景)。所以我最终得到纯色:)
无论如何,有没有从代码中设置背景ti的渐变,而不使用XAML表示法:
<LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">
<GradientStopCollection>
<GradientStop Color=\"#ff444444\" Offset=\"0\" />
<GradientStop Color=\"#ff000000\" Offset=\"1\" />
</GradientStopCollection>
</LinearGradientBrush>
解决方法
问题是,当您在代码中指定渐变停止时,您未指定偏移量。
但是,我建议您不要避免使用Xaml作为解决方案。首先阅读此博客:通用布尔值转换器。我还建议您的Hightlight属性应为
bool
类型,而不是int类型。
通过将博客中的转换器代码包含在您的项目中,您应该可以执行以下操作:
<Grid x:Name=\"LayoutRoot\">
<Grid.Resources>
<local:BoolToBrushConverter x:Key=\"Highlighter\">
<local:BoolToBrushConverter.TrueValue>
<LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">
<GradientStopCollection>
<GradientStop Color=\"#4cffffcc\" Offset=\"0\" />
<GradientStop Color=\"#ffffffcc\" Offset=\"1\" />
</GradientStopCollection>
</LinearGradientBrush>
</local:BoolToBrushConverter.TrueValue>
<local:BoolToBrushConverter.FalseValue>
<LinearGradientBrush StartPoint=\"0,1\">
<GradientStopCollection>
<GradientStop Color=\"#4ce6e6e6\" Offset=\"0\" />
<GradientStop Color=\"#ffe6e6e6\" Offset=\"1\" />
</GradientStopCollection>
</LinearGradientBrush>
</local:BoolToBrushConverter.FalseValue>
</local:BoolToBrushConverter>
</Grid.Resources>
<ListBox
Name=\"lstResults\"
ItemContainerStyle=\"{StaticResource ListBoxItemStyle1}\">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Background=\"{Binding highlight,Converter={StaticResource Highlighter}}\">
<StackPanel>
<TextBlock Text=\"{Binding name}\" TextWrapping=\"Wrap\" FontSize=\"24\" FontWeight=\"Bold\" Foreground=\"Black\"/>
<TextBlock Text=\"{Binding address}\" TextWrapping=\"Wrap\" FontSize=\"24\" Foreground=\"Black\" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这种方法不仅使您能够以更熟悉的Xaml方式保持视觉描述,而且更加灵活和可恢复。
,您需要将背景绑定更改为Background=\"{Binding highlight,Converter={StaticResource myConverter}}\"