每个元素的集合都用于实现从第一个元素到最后一个元素的渐变

时间:2015-03-02 18:52:24

标签: c# wpf xaml mvvm colors

我使用256个值的数组绘制灰度图像的直方图。我是通过创建自己的256个垂直矩形(列)图表来实现的。我的目标是第一个矩形填充颜色为红色,最后一个矩形为蓝色。中间的所有矩形都用纯色填充,这将使第一个(红色)到最后一个(蓝色)的过渡平滑,就像在改变颜色时采用带有矩形步骤的渐变一样。

当您查看代码时,您可以看到我能够从数组中获取每个元素(矩形)的索引值。这封装在AlternationIndex中,我认为解决方案应该使用它来操作Fill颜色值。是否有可能为此提供纯XAML解决方案?

所以过渡应该类似于:

enter image description here

这是我的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; }

1 个答案:

答案 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。然后梯度问题将是微不足道的。