que tenía ese problema a un tiempo atrás y yo estaba tan molesto por lo que hice una solución fea para él. no es bonito, pero se pone el trabajo hecho. Primero, t Esto es solo un problema cuando el ScrollBar Horizontal es invisible, así que vamos a necesitar una referencia al mismo. Este código deberá ejecutarse una vez que se hayan cargado todos los DataGridColumns (en mi caso, todo en Xaml, por lo que el evento Loaded) y no tiene en cuenta la adición o eliminación de DataGridColumns, pero es una solución fácil.
<DataGrid Name="c_dataGrid"
Loaded="c_dataGrid_Loaded"
...>
<DataGrid.Columns>
<DataGridTextColumn ..."/>
<DataGridTextColumn ..."/>
<!-- ... -->
Luego, en el manejador de sucesos Loaded obtenemos la cuadrícula de datos ScrollViewer y añadir un detector de cambios en la ActualWidthProperty de cada DataGridColumn en la cuadrícula de datos.
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);
}
}
}
Y entonces se calcula el tamaño de la cuadrícula de datos desde el tamaño de todos los DataGridColumns y añadir una constante de 8,0 (que es la diferencia normalmente).
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;
}
}
}
Si usted viene con una mejor forma de hacer esto, entonces hágamelo saber :)
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;
}
Esa es una buena solución. Lo modifiqué ligeramente para que establezca la propiedad MaxWidth en su lugar. Esto resuelve el problema de la cuadrícula expandiéndose más allá de las limitaciones del padre visual. También lo convertí en un comportamiento para encapsularlo mejor. – jjrdk
Además, si no se está llamando a DataGridColumn_ActualWidthChanged, asegúrese de utilizar Microsoft.Windows.Controls.DataGridColumn y no System.Windows.Controls.DataGridColumn cuando obtenga DependencyPropertyDescriptor. – Monsignor