private async Task DrawVisualsAsync(GridRange dataViewport, IGridData <string> data, GridUpdateType updateType, Rect visualViewport, bool suppressNotification, CancellationToken token) { await _services.MainThread().SwitchToAsync(token); DataGrid.SelectedIndex = new GridIndex(Math.Min(DataGrid.SelectedIndex.Row, DataProvider.RowCount - 1), Math.Min(DataGrid.SelectedIndex.Column, DataProvider.ColumnCount - 1)); var columnsData = new RangeToGrid <string>(dataViewport.Columns, data.ColumnHeader, true); var rowsData = new RangeToGrid <string>(dataViewport.Rows, data.RowHeader, false); var cellsData = data.Grid; using (Points.DeferChangeNotification(suppressNotification)) { // measure points ColumnHeader.MeasurePoints( Points.GetAccessToPoints(ColumnHeader.ScrollDirection), new GridRange(new Range(0, 1), dataViewport.Columns), columnsData, updateType); RowHeader.MeasurePoints( Points.GetAccessToPoints(RowHeader.ScrollDirection), new GridRange(dataViewport.Rows, new Range(0, 1)), rowsData, updateType == Sort ? Refresh : updateType); DataGrid.MeasurePoints( Points.GetAccessToPoints(DataGrid.ScrollDirection), dataViewport, cellsData, updateType == Sort ? Refresh : updateType); // adjust Offset in case of overflow if ((Points.HorizontalOffset + visualViewport.Width).GreaterOrCloseTo(Points.HorizontalExtent)) { Points.HorizontalOffset = Points.HorizontalExtent - visualViewport.Width; } if ((Points.VerticalOffset + visualViewport.Height).GreaterOrCloseTo(Points.VerticalExtent)) { Points.VerticalOffset = Points.VerticalExtent - visualViewport.Height; } if (updateType == ScrollIntoView) { AdjustFocusedCellOffset(visualViewport); } // arrange and draw gridline ColumnHeader.ArrangeVisuals(Points.GetAccessToPoints(ColumnHeader.ScrollDirection)); RowHeader.ArrangeVisuals(Points.GetAccessToPoints(RowHeader.ScrollDirection)); DataGrid.ArrangeVisuals(Points.GetAccessToPoints(DataGrid.ScrollDirection)); Points.ViewportHeight = DataGrid.RenderSize.Height; Points.ViewportWidth = DataGrid.RenderSize.Width; } DataViewport = dataViewport; Data = data; _owner.AutomationPeer?.Update(); }
private void DrawVisuals( GridRange dataViewport, IGridData <string> data, bool refresh, Rect visualViewport, bool suppressNotification) { using (var deferal = Points.DeferChangeNotification(suppressNotification)) { // measure points ColumnHeader?.MeasurePoints( Points.GetAccessToPoints(ColumnHeader.ScrollDirection), new GridRange(new Range(0, 1), dataViewport.Columns), new RangeToGrid <string>(dataViewport.Columns, data.ColumnHeader, true), refresh); RowHeader?.MeasurePoints( Points.GetAccessToPoints(RowHeader.ScrollDirection), new GridRange(dataViewport.Rows, new Range(0, 1)), new RangeToGrid <string>(dataViewport.Rows, data.RowHeader, false), refresh); DataGrid?.MeasurePoints( Points.GetAccessToPoints(DataGrid.ScrollDirection), dataViewport, data.Grid, refresh); // adjust Offset in case of overflow if ((Points.HorizontalOffset + visualViewport.Width).GreaterThanOrClose(Points.HorizontalExtent)) { Points.HorizontalOffset = Points.HorizontalExtent - visualViewport.Width; } if ((Points.VerticalOffset + visualViewport.Height).GreaterThanOrClose(Points.VerticalExtent)) { Points.VerticalOffset = Points.VerticalExtent - visualViewport.Height; } // arrange and draw gridline ColumnHeader?.ArrangeVisuals(Points.GetAccessToPoints(ColumnHeader.ScrollDirection)); RowHeader?.ArrangeVisuals(Points.GetAccessToPoints(RowHeader.ScrollDirection)); DataGrid?.ArrangeVisuals(Points.GetAccessToPoints(DataGrid.ScrollDirection)); Points.ViewportHeight = DataGrid.RenderSize.Height; Points.ViewportWidth = DataGrid.RenderSize.Width; } }