我需要在用C#/ WPF编写的总线调度图查看器(以及可能的编辑器)中围绕X轴实现缩放和平移。我可以使用简单的变换,但请注意,当点之间的距离变大时,点的大小保持不变。此外,无论我如何平移图表,公交车站的名称应保留在左侧的固定位置:
使用当前方法,所有视觉效果都在单个ItemsControl上呈现,其中Canvas作为ItemsPanel和几个DataTemplates,每种类型的形状(点,线段,时间分割线,工作站线)。因此,每个形状都绑定到根据ViewModel,它具有PosX和PosY属性,提供给Canvas:
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left"
Value="{Binding Path=PosX, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="Canvas.Top"
Value="{Binding Path=PosY, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</ItemsControl.ItemContainerStyle>
当我需要平移或缩放时,我为每个形状的视图模型调用OnPropertyChanged(“PosX”)。然后使用整个图形的PanX和ZoomX属性的新值重新计算属性:
public double PosX
{
get
{
return _scheduleGraphViewModel.ZoomX * _shedulePointModel.PlanTime + _scheduleGraphViewModel.PanX;
}
}
问题在于,这比我希望的要慢得多。在1000+点上它几乎无法使用。 Profiler告诉我瓶颈在于OnPropertyChanged方法。
我认为整个方法都是错误的,但我找不到或想出更好的解决方案。
答案 0 :(得分:0)
将图表分隔成如下结构:
ParentGrid1
StationNames
ParentGrid2 // Apply transformation on this
LinesInGraph
PointsInGraph
Point1 // Apply inverse transformation on each of these
Point2
Point3
...