WPF-Columna DataGrid con ancho="*", pero MinWidth para ajustar el contenido
datagrid wpf binding (5)
¿Cuál sería la mejor / forma correcta de tener un conjunto de columnas DataGrid
con un ancho proporcional ( Width="/*"),
pero para que su ancho mínimo sea al menos el ancho de su contenido? Por el momento, si utilizo Width="*"
, las columnas se mantienen exactamente proporcionales, pero el contenido se recorta si las columnas se vuelven demasiado delgadas. Si utilizo Width="Auto"
, las columnas se adaptan perfectamente a su contenido, pero esto hace que sean de diferentes tamaños.
Lo que quiero es realmente una combinación de los dos, como Width="/*"
, MinWidth="Auto"
modo que cuando haya un ancho adicional, las columnas se MinWidth="Auto"
por igual, pero cuando la cuadrícula se hace más pequeña, el contenido nunca se recorta
Lamentablemente, MinWidth="Auto"
no existe, así que supongo que debo vincular la propiedad MinWidth
la columna, pero es difícil saber exactamente a qué lo vincularía.
¿Cómo le digo a WPF "MinWidth="
el ancho del contenido más ancho de la columna?
Dale un nombre a la columna en el XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" Name="Col1"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>
A continuación, establezca la propiedad MinWidth
en el código como se muestra a continuación:
public MainWindow()
{
InitializeComponent();
Col1.MinWidth = 340; //enter desired minimum width here
}
Establecer Width = "Auto"
en XAML.
Luego en el código:
MinWidth = ActualWidth
Width = new GridLength(1, GridUnitType.Star)
Sé que es un poco tarde, pero encontré tu pregunta y programé una solución de XAML puro.
<ColumnDefinition Width="42*" MinWidth="{Binding Path=ActualWidth, ElementName=projectInfoHeader }"/>
Donde ElementName
señala que el control ocupa la mayor parte del espacio. Por supuesto, eso solo es posible con elementos que tienen un ancho limitado. Si lo hace, por ejemplo, para un GroupBox
, entonces puede cambiar el tamaño solo para un ancho mayor y nunca cambiar el tamaño a uno más pequeño.
Si tiene varios candidatos para el valor de MinWidth
, necesita escribir usted mismo un IMultiValueConverter
, que toma un objeto [], lo analiza para que flote y devuelve el máximo (es solo 1 consulta de linq si lo usa solo y no lo hace Necesito manejar el mal uso del convertidor
De esta manera también es compatible con el cambio dinámico de MinWidth
.
Simplemente puede usar el código a continuación para establecer el ancho máximo o mínimo de la columna
<ColumnDefinition Width="*" MaxWidth="40"/>
Esto tomará el espacio disponible, pero se limitará a un máximo de 40 px
puedes hacer lo mismo con minwidth también
<ColumnDefinition Width="*" MinWidth="50"/>
Esto tomará el espacio disponible, pero siempre asegúrese de que tenga 50 píxeles de espacio como mínimo. Espero que esto ayude
También tuve problemas para dimensionar las columnas de cuadrícula correctamente dentro de GridViewColumn. Hubo varias cosas que intenté pero luego encontré el UniformGrid. Fue la mejor solución para mí. Simplemente funciona. No lo sabía antes ... parece que no existe en la caja de herramientas VS por defecto (?) Y, por lo tanto, no sabía que existía.
Puede encontrar más acerca de UniformGrid desde here .