private void RegisterEvents(DependencyObject start) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(start); i++) { Visual childVisual = VisualTreeHelper.GetChild(start, i) as Visual; if (childVisual is Thumb) { GridViewColumn gridViewColumn = FindParentColumn(childVisual); if (gridViewColumn != null) { Thumb thumb = childVisual as Thumb; if (ProportionalColumn.IsProportionalColumn(gridViewColumn)) { thumb.IsHitTestVisible = false; } } } else if (childVisual is GridViewColumnHeader) { GridViewColumnHeader columnHeader = childVisual as GridViewColumnHeader; columnHeader.SizeChanged += GridColumnHeaderSizeChanged; } else if (scrollViewer == null && childVisual is ScrollViewer) { scrollViewer = childVisual as ScrollViewer; scrollViewer.ScrollChanged += ScrollViewerScrollChanged; // assume we do the regulation of the horizontal scrollbar scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; scrollViewer.VerticalScrollBarVisibility = verticalScrollBarVisibility; } RegisterEvents(childVisual); // recursive } }
private void UnregisterEvents(DependencyObject start) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(start); i++) { Visual childVisual = VisualTreeHelper.GetChild(start, i) as Visual; if (childVisual is Thumb) { GridViewColumn gridViewColumn = FindParentColumn(childVisual); if (gridViewColumn != null) { Thumb thumb = childVisual as Thumb; if (ProportionalColumn.IsProportionalColumn(gridViewColumn)) { thumb.IsHitTestVisible = true; } } } else if (childVisual is GridViewColumnHeader) { GridViewColumnHeader columnHeader = childVisual as GridViewColumnHeader; columnHeader.SizeChanged -= GridColumnHeaderSizeChanged; } else if (scrollViewer == null && childVisual is ScrollViewer) { scrollViewer = childVisual as ScrollViewer; scrollViewer.ScrollChanged -= ScrollViewerScrollChanged; } UnregisterEvents(childVisual); // recursive } }
protected virtual void ResizeColumns() { GridView view = listView.View as GridView; if (view == null || view.Columns.Count == 0) { return; } double actualWidth = double.PositiveInfinity; if (scrollViewer != null) { actualWidth = scrollViewer.ViewportWidth; } if (double.IsInfinity(actualWidth)) { actualWidth = listView.ActualWidth; } if (double.IsInfinity(actualWidth) || actualWidth <= 0) { return; } double resizeableRegionCount = 0; double otherColumnsWidth = 0; foreach (GridViewColumn gridViewColumn in view.Columns) { if (ProportionalColumn.IsProportionalColumn(gridViewColumn)) { double?proportionalWidth = ProportionalColumn.GetProportionalWidth(gridViewColumn); if (proportionalWidth != null) { resizeableRegionCount += proportionalWidth.Value; } } else { otherColumnsWidth += gridViewColumn.ActualWidth; } } if (resizeableRegionCount <= 0) { if (scrollViewer != null) { scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; } return; } double resizeableColumnsWidth = actualWidth - otherColumnsWidth; if (resizeableColumnsWidth <= 0) { return; } double resizeableRegionWidth = resizeableColumnsWidth / resizeableRegionCount; foreach (GridViewColumn gridViewColumn in view.Columns) { if (!ProportionalColumn.IsProportionalColumn(gridViewColumn)) { continue; } double?proportionalWidth = ProportionalColumn.GetProportionalWidth(gridViewColumn); if (proportionalWidth != null) { gridViewColumn.Width = proportionalWidth.Value * resizeableRegionWidth; } } }