我开发了一个简单的直方图控件,可以显示实时图像中灰度颜色(1到256个分档)的分布。该控件在ItemsControl中呈现Rectangle,其ItemsContainer是ViewBox。在大多数情况下,一切都工作正常,但是当我调整托管控件的网格列(使用GridSplitter)时,直方图的保真度开始降低。
这是直方图在其初始状态下的几个镜头,然后在水平调整大小时(注意绿色矩形森林中的深色垂直线......我越小越好):
这是呈现直方图的XAML:
<ItemsControl x:Name="_Histogram" Margin="1,3"
ItemsSource="{Binding HistogramCollection}"
VerticalAlignment="Bottom">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Grid>
<Viewbox Stretch="Fill" MaxHeight="100" >
<ItemsPresenter />
</Viewbox>
</Grid>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Rectangle Fill="LimeGreen"
Stretch="Fill"
Height="{Binding Bin}"
MinWidth="1"
StrokeThickness="0"
VerticalAlignment="Bottom"
HorizontalAlignment="Stretch"
RenderOptions.EdgeMode="Aliased"
UseLayoutRounding="True"
MouseEnter="Rectangle_MouseEnter"
MouseLeave="Rectangle_MouseLeave"
/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
有什么想法?我的猜测是,WPF会丢弃一些Visual,以便均匀分配其余部分。
我已经尝试使用Polygon代替ItemsControl和Rectangles来分配我的bin点并且行为消失了,但是,我需要能够MouseOver直方图并显示弹出窗口(除其他外,例如选择一个我的ViewModel中的bin和update属性的范围。如果你知道一种方法,使用多边形方法,我可以将鼠标悬停在绿色区域并确定我已经超过特定的区域,我肯定会对此持开放态度。
更新:
删除矩形XAML上的RenderOptions.EdgeMode =“Aliased”似乎解决了黑线毛刺的问题。虽然它在Designer中渲染得有些苍白(使用d:DesignData),但它似乎在运行时渲染得很好。我将推迟标记为“已回答”,直到其他人有机会进入。我真的对多边形方法感兴趣,因为当调整到更大的宽度时,我得到一个更清晰的直方图(我做的更宽)直方图,峰值得到的像素化程度越高,即由于矩形的宽度,峰值是平坦的,这表示为锯齿状的图而不是平滑的曲线图。如果只有Point将鼠标悬停在处理程序上:D。