WPF中的选择性缩放和平移

时间:2011-12-06 07:09:09

标签: c# wpf

我需要在用C#/ WPF编写的总线调度图查看器(以及可能的编辑器)中围绕X轴实现缩放和平移。我可以使用简单的变换,但请注意,当点之间的距离变大时,点的大小保持不变。此外,无论我如何平移图表,公交车站的名称应保留在左侧的固定位置:

before zoom after zoom

使用当前方法,所有视觉效果都在单个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方法。

我认为整个方法都是错误的,但我找不到或想出更好的解决方案。

1 个答案:

答案 0 :(得分:0)

将图表分隔成如下结构:

ParentGrid1
    StationNames
    ParentGrid2        // Apply transformation on this
        LinesInGraph
        PointsInGraph
            Point1     // Apply inverse transformation on each of these
            Point2
            Point3
            ...