我使用256个值的数组绘制灰度图像的直方图。我是通过创建自己的256个垂直矩形(列)图表来实现的。我的目标是第一个矩形填充颜色为红色,最后一个矩形为蓝色。中间的所有矩形都用纯色填充,这将使第一个(红色)到最后一个(蓝色)的过渡平滑,就像在改变颜色时采用带有矩形步骤的渐变一样。
当您查看代码时,您可以看到我能够从数组中获取每个元素(矩形)的索引值。这封装在AlternationIndex中,我认为解决方案应该使用它来操作Fill颜色值。是否有可能为此提供纯XAML解决方案?
所以过渡应该类似于:
这是我的XAML代码
<ItemsControl ItemsSource="{Binding HistogramValues}" AlternationCount="{Binding Path=HistogramValues.Count}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Height="{Binding}" ToolTip="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentPresenter}}" Width="3" VerticalAlignment="Bottom" Fill="Black"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我在视图模型中的位置:
public float[] HistogramValues { get; set; }
答案 0 :(得分:1)
编写一个自定义转换器,它将传递AlternationIndex&amp; AlternationCount作为参数,并吐出颜色。
您可以在给定这两个参数的颜色之间进行线性插值:
R = firstCol.R * p + secondCol.R * (1 - p)
公式非常简单,firstCol
是起始颜色,secondCol
是结束颜色。
p代表当前百分比,可以计算为currentAlternationIndex / AlternationCount
。
您可以为每个组件(R,G,B)执行此类计算,并且转换器可以使用具体组件返回SolidColorBrush
。
不确定纯Xaml解决方案的含义。如果你的意思是没有转换器,那么可能没有足够的东西在这里提及。
另一种解决方案是从高度模型切换到线模型。也许您可以使用Polyline绘制数据&amp;而不是ItemsControl。然后梯度问题将是微不足道的。