tôi đã có vấn đề với một thời gian trở lại và tôi đã nhận được rất khó chịu bởi nó mà tôi đã thực hiện một sửa chữa xấu xí cho nó. nó không đẹp, nhưng nó được công việc đã xong. của anh ta chỉ là một vấn đề khi Horizontal ScrollBar là vô hình vì vậy chúng tôi sẽ cần một tham chiếu đến nó. Mã này sẽ phải được chạy một khi tất cả các DataGridColumn đã được nạp (trong trường hợp của tôi, tất cả trong Xaml, vì vậy sự kiện Loaded) và nó không có thêm/loại bỏ DataGridColumns vào xem xét nhưng đó là một sửa chữa dễ dàng.
<DataGrid Name="c_dataGrid"
Loaded="c_dataGrid_Loaded"
...>
<DataGrid.Columns>
<DataGridTextColumn ..."/>
<DataGridTextColumn ..."/>
<!-- ... -->
Sau đó, trong EventHandler Loaded chúng tôi nhận được DataGrid ScrollViewer và thêm một người biết lắng nghe cho những thay đổi trong ActualWidthProperty của mỗi DataGridColumn trong DataGrid.
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);
}
}
}
Và sau đó chúng tôi tính toán kích thước của DataGrid từ kích thước của tất cả DataGridColumn và thêm hằng số 8,0 (đó là sự khác biệt bình thường).
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;
}
}
}
Nếu bạn đưa ra một cách tốt hơn để làm điều này sau đó cho tôi biết :)
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;
}
Nguồn
2010-11-15 22:19:14
Đó là một giải pháp tốt đẹp. Tôi đã tinh chỉnh nó một chút để nó đặt thuộc tính MaxWidth thay thế. Điều này giải quyết vấn đề của lưới mở rộng vượt ra ngoài các ràng buộc của cha mẹ trực quan. Tôi cũng chuyển đổi nó thành một hành vi thay thế để đóng gói nó tốt hơn. – jjrdk
Ngoài ra, nếu DataGridColumn_ActualWidthChanged không được gọi, đảm bảo rằng bạn sử dụng Microsoft.Windows.Controls.DataGridColumn và không phải là System.Windows.Controls.DataGridColumn khi bạn đang nhận DependencyPropertyDescriptor. – Monsignor