c# - asp - GridViewColumn Ajuste de ancho
gridview c# (2)
Mi UI:
<ListView Name="persons" SelectionChanged="persons_SelectionChanged">
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="auto"/>
<GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="auto"/>
</GridView>
</ListView.View>
</ListView>
El código detrás de mi UI:
internal void Update(IEnumerable<Person> pers)
{
this.persons.ItemsSource = null;
this.persons.ItemsSource = pers;
UpdateLayout();
}
Mis entidades:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Los GridViewColumns tienen el ancho del GridViewColumn-Header. Incluso si llamo a Update () con Personas con un nombre largo. La columna no cambia de tamaño.
a) ¿Cómo puedo cambiar el tamaño de la columna "Nombre" automáticamente (cuando llamé a Actualización) a la longitud del Nombre más largo, pero no más largo que un Valor x (quiero especificar el ancho máximo de una columna)?
b) ¿Cómo puedo especificar que la columna "Edad" llene el espacio hasta el final del control (para que las columnas de la vista en cuadrícula utilicen el ancho completo del control)?
GridView no cambia de tamaño automáticamente.
Para cambiar el tamaño de las columnas, puedes
foreach (GridViewColumn c in gv.Columns)
{
// Code below was found in GridViewColumnHeader.OnGripperDoubleClicked() event handler (using Reflector)
// i.e. it is the same code that is executed when the gripper is double clicked
// if (adjustAllColumns || App.StaticGabeLib.FieldDefsGrid[colNum].DispGrid)
if (double.IsNaN(c.Width))
{
c.Width = c.ActualWidth;
}
c.Width = double.NaN;
}
En cuanto a dimensionar el último para llenar el área, lo hago con un convertidor. No creo que este convertidor haga exactamente lo que necesita para esto, pero debería ayudarlo a comenzar.
<GridViewColumn Width="{Binding ElementName=lvCurDocFields, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=100}">
[ValueConversion(typeof(double), typeof(double))]
public class WidthConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// value is the total width available
double otherWidth;
try
{
otherWidth = System.Convert.ToDouble(parameter);
}
catch
{
otherWidth = 100;
}
if (otherWidth < 0) otherWidth = 0;
double width = (double)value - otherWidth;
if (width < 0) width = 0;
return width; // columnsCount;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
GridView es rápido pero lleva un poco de cuidado de niños.
Saqué esto de Cómo autocalibrar y alinear correctamente los datos de GridViewColumn en WPF?
<Window.Resources>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</Window.Resources>
Eso te ayuda en absoluto?