我正在寻找一种在WPF中设置数据网格列宽的方法,以便当数据网格通常显示它的水平滚动条时,意味着数据网格的宽度大于其父级容器,它将切换到自动大小的列。如果容器元素大于自动调整大小的数据网格,则将数据网格列宽设置为*,以便均匀分布。
目前我有一个自定义数据网格覆盖基础数据网格,其上包含AutomaticColumnWidths
依赖项属性。将其设置为True
将导致列均匀分布(*),False
将切换为自动调整大小。
只要用户没有调整窗口大小,这就有效。如果他们确实调整了列的大小,则无论窗口大小如何,都将保持先前设置的模式。
有没有人对如何做到这一点有任何想法?我想过要弄清楚如何挂钩HorizontalScrollbarVisiblity
属性,但是当它的可见性发生变化时,我没有看到要捕获的事件。
这是我当前的自定义DataGrid
public class CustomDataGrid : DataGrid
{
/// <summary>Automatic column widths dependency property</summary>
public static readonly DependencyProperty AutomaticColumnWidthsProperty =
DependencyProperty.Register("AutomaticColumnWidths", typeof(Boolean), typeof(CustomDataGrid), new PropertyMetadata(true));
/// <summary>Get/Set AutomaticColumnWidths</summary>
public bool AutomaticColumnWidths
{
get
{
return (bool)GetValue(AutomaticColumnWidthsProperty);
}
set
{
SetValue(AutomaticColumnWidthsProperty, value);
}
}
/// <summary>
/// Constructor
/// </summary>
public NauFilteredDataGrid()
{
this.SourceUpdated += OnSourceUpdated;
}
/// <summary>
/// On source update event handler
/// </summary>
private void OnSourceUpdated(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(() => UpdateColumnMinWidths(), DispatcherPriority.ContextIdle);
}
/// <summary>
/// Updates the column minimum widths
/// </summary>
private void UpdateColumnMinWidths()
{
if (AutomaticColumnWidths)
{
foreach (DataGridColumn col in this.Columns)
{
col.Width = 0;
this.UpdateLayout();
col.Width = new DataGridLength(1, DataGridLengthUnitType.Star); //1*
}
}
}
}