Auto row scrolling

When you drag a time item outside of the screen – in the time direction – you auto scroll in time. But when dragging the time item out of screen to the top or bottom we should auto scroll rows.

This needs a new event since we are not really sure exactly how the Gantt Rows are grouped to form a Gantt chart – you can use any control like a DataGrid or a ListView to group the rows.

This is one example of how to implement row scrolling with the new event:

    private void _GanttControl_OnConsiderRowAutoScroll(object sender, OnConsiderRowAutoScrollArgs e)
    {
    
      var trans= e.TimeItem.TransformToVisual(_GanttControl);
      var posInGanttCoords = trans.Transform(new Point(0, 0));
      if (posInGanttCoords.Y < _GanttControl.DateScaler.ActualHeight)
      {
        // scroll up
        ControlTemplate template = this._ItemsControl.Template;
        ScrollViewer scrollViewer = (ScrollViewer)template.FindName("_ScrollViewer", this._ItemsControl);
        scrollViewer.LineUp();       
        e.ScrollDoneReMeassure = true;
      }

      if (posInGanttCoords.Y > _GanttControl.ActualHeight)
      {
        //scroll down
        ControlTemplate template = this._ItemsControl.Template;
        ScrollViewer scrollViewer = (ScrollViewer)template.FindName("_ScrollViewer", this._ItemsControl);
        scrollViewer.LineDown();
        e.ScrollDoneReMeassure = true;
      }

    }

 

In this particular case the Gantt is held in a ItemsControl that has a scrollviewer that has the name of _ScrollViewer. So the new Event OnConsiderRowAutoScroll is called whenever the TimeItem is dragged of the GanttRow.

Then we need to check if the TimeItem should initiate an AutoScroll – and if it does we need to scroll and set the flag e.ScrollDoneReMeassure=true – this way the Gantt knows that the worlds has changed.

image

Leave a Reply