首页 文章

WPF中的选择性缩放和平移

提问于
浏览
0

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

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

    将图表分隔成如下结构:

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

相关问题