gpt4 book ai didi

当列宽缩小时,WPF DataGrid 不会缩小

转载 作者:行者123 更新时间:2023-12-04 15:15:40 24 4
gpt4 key购买 nike

我在 WPF 中使用 DataGrid 并希望它缩小以仅适合其列的宽度。对于初始渲染,它可以很好地做到这一点。当我调整列的大小以使其更宽时,网格也会增长。但是,如果我重新调整列的大小以使其再次变窄,我会在列的右侧获得空白(并且我可以看到列标题灰色区域扩展到列之外。

我想让数据网格与列一起缩小其宽度,这样我就不会在右边得到空白。我试图调试代码,据我所知,问题出在 DataGridCellsPanel 中,但我看不到任何地方可以修复宽度测量。

任何帮助,将不胜感激。

最佳答案

不久前我遇到了这个问题,我对此感到非常恼火,以至于我对其进行了丑陋的修复。它不漂亮,但它完成了工作。首先,这只是 Horizo​​ntal ScrollBar 不可见时的问题,因此我们需要引用它。一旦加载了所有 DataGridColumns(在我的情况下,全部在 Xaml 中,因此 Loaded 事件),必须运行此代码,并且它不考虑添加/删除 DataGridColumns,但这是一个简单的修复。

<DataGrid Name="c_dataGrid"
Loaded="c_dataGrid_Loaded"
...>
<DataGrid.Columns>
<DataGridTextColumn ..."/>
<DataGridTextColumn ..."/>
<!-- ... -->

然后在 Loaded EventHandler 中,我们获取 DataGrid ScrollViewer 并为 DataGrid 中每个 DataGridColumn 的 ActualWidthProperty 的更改添加一个监听器。
private ScrollViewer m_dataGridScrollViewer = null;
private void c_dataGrid_Loaded(object sender, RoutedEventArgs e)
{
m_dataGridScrollViewer = GetVisualChild<ScrollViewer>(c_dataGrid);
DependencyPropertyDescriptor dependencyPropertyDescriptor =
DependencyPropertyDescriptor.FromProperty(DataGridColumn.ActualWidthProperty, typeof(DataGridColumn));
if (dependencyPropertyDescriptor != null)
{
foreach (DataGridColumn column in c_dataGrid.Columns)
{
dependencyPropertyDescriptor.AddValueChanged(column, DataGridColumn_ActualWidthChanged);
}
}
}

然后我们根据所有 DataGridColumns 的大小计算 DataGrid 的大小,并添加一个常数 8.0(通常是差值)。
private void DataGridColumn_ActualWidthChanged(object sender, EventArgs e)
{
if (m_dataGridScrollViewer != null)
{
if (m_dataGridScrollViewer.ComputedHorizontalScrollBarVisibility != Visibility.Visible)
{
double dataGridWidth = 8.0;
foreach (DataGridColumn column in c_dataGrid.Columns)
{
dataGridWidth += column.ActualWidth;
}
c_dataGrid.Width = dataGridWidth;
}
else
{
c_dataGrid.Width = double.NaN;
}
}
}

如果您想出更好的方法,请告诉我:)
public static T GetVisualChild<T>(object parent) where T : Visual
{
DependencyObject dependencyObject = parent as DependencyObject;
return InternalGetVisualChild<T>(dependencyObject);
}
private static T InternalGetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);

int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}

关于当列宽缩小时,WPF DataGrid 不会缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4186694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com