using System.Diagnostics; using System.Reflection; using System.Windows.Controls; namespace WPFluent.Controls; /// /// Extends , and adds layout support for , which can have and . /// public class GridViewHeaderRowPresenter : System.Windows.Controls.GridViewHeaderRowPresenter { public GridViewHeaderRowPresenter() { Loaded += OnLoaded; } private void OnLoaded(object sender, RoutedEventArgs e) { UpdateIndicatorStyle(); } private void UpdateIndicatorStyle() { FieldInfo? indicatorField = typeof(System.Windows.Controls.GridViewHeaderRowPresenter).GetField( "_indicator", BindingFlags.NonPublic | BindingFlags.Instance); if (indicatorField == null) { Debug.WriteLine("Failed to get the _indicator field"); return; } if (indicatorField.GetValue(this) is Separator indicator) { indicator.Margin = new Thickness(0); indicator.Width = 3.0; ResourceDictionary resourceDictionary = new() { Source = new Uri( "pack://application:,,,/WPFluent;component/Controls/GridView/GridViewHeaderRowIndicator.xaml", UriKind.Absolute), }; if (resourceDictionary["GridViewHeaderRowIndicatorTemplate"] is ControlTemplate template) { indicator.Template = template; } else { Debug.WriteLine("Failed to get the GridViewHeaderRowIndicatorTemplate"); } } } protected override Size ArrangeOverride(Size arrangeSize) { // update the desired width of each column (clamps desiredwidth to MinWidth and MaxWidth) if (Columns != null) { foreach (GridViewColumn column in Columns.OfType()) { column.UpdateDesiredWidth(); } } return base.ArrangeOverride(arrangeSize); } protected override Size MeasureOverride(Size constraint) { if (Columns != null) { foreach (GridViewColumn column in Columns.OfType()) { column.UpdateDesiredWidth(); } } return base.MeasureOverride(constraint); } }