2012-01-31 17 views
5

Mi interfaz de usuario:GridViewColumn ajuste de ancho

<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 Codebehind de mi interfaz de usuario:

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 de la GridViewColumn-cabecera. 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 Update) a la longitud del nombre más largo, pero no más de un valor x (quiero especificar el ancho máximo de una columna) ?

b) ¿Cómo puedo especificar que la columna "Edad" llene el espacio al final del control (para que las columnas de la vista de cuadrícula utilicen el ancho completo del control)?

Respuesta

6

GridView no cambia el tamaño automáticamente.

Para cambiar el tamaño de las columnas que puede

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; 
    } 

Como para el dimensionamiento de la última zona para llenar 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.

+0

Sé que esto es bastante antiguo, pero quiero destacar, cuán importante es el tiempo de la corrección 'ColumnWidth' y que realmente funciona bien cuando se aplica correctamente. Asegúrese de que el contenedor GridView esté cargado y visible. Tuve una combinación desagradable de un GridView que se colocó dentro de un expansor que a su vez era parte de un control virtual de virtualización. Es decir, un cambio de tamaño sin estar en pantalla daría un ancho cero y los artículos podrían cambiar cuando la plantilla se recicla para diferentes datos. Ahora estoy un poco feliz con mi solución. – grek40

Cuestiones relacionadas