我开发了一个简单的直方图控件,它显示了实时图像中灰度颜色(1 到 256 个 bin)的分布。该控件在 ItemsControl 中呈现矩形,其 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 丢弃了一些视觉效果,以便均匀分布其余部分。
我已经尝试使用 Polygon 代替 ItemsControl 和 Rectangles 来分配我的 bin 点并且行为消失了,但是,我需要能够将 MouseOver 直方图并显示一个弹出窗口(除其他外,例如选择一系列 bin并更新我的 ViewModel 中的属性)。如果您知道一种方法,使用多边形方法,我可以将鼠标悬停在绿色区域并确定我在一个特定的垃圾箱上,我肯定对此持开放态度。
更新:
移除 Rectangle XAML 上的 RenderOptions.EdgeMode="Aliased" 似乎可以解决黑线故障的问题。虽然它在设计器中渲染得有些苍白(使用 d:DesignData),但它似乎在运行时渲染得很好。在其他人有机会加入之前,我将推迟标记为“已回答”。我对多边形方法非常感兴趣,因为当我调整到更大的宽度时,我会得到一个更清晰的直方图(我做的越宽直方图,峰的像素化程度越高,即峰是平坦的,因为矩形的宽度,呈现为锯齿状图而不是平滑曲线图)。如果只有 Point 有一个鼠标悬停在处理程序上:D。