2012-01-31 22 views
5

mio UI:GridViewColumn Larghezza Regolazione

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

codebehind della mia UI:

internal void Update(IEnumerable<Person> pers) 
    { 
     this.persons.ItemsSource = null; 
     this.persons.ItemsSource = pers; 
     UpdateLayout(); 
    } 

miei Entità:

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

I GridViewColumns hanno la larghezza della GridViewColumn-Header. Anche se chiamo Update() con persone con un nome lungo. La colonna non viene ridimensionata.

a) Come posso ridimensionare il "Nome" -colonna automaticamente (quando ho chiamato Aggiorna) alla lunghezza del Nome più lungo, ma non più lungo di un Valore x (Voglio specificare una larghezza massima di una colonna) ?

b) Come posso specificare che la colonna "Età" riempie lo spazio fino alla fine del controllo (in modo che le colonne di GridView utilizzino la larghezza completa del controllo)?

risposta

6

GridView non viene ridimensionato automaticamente.

Per ridimensionare le colonne si può

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

Per quanto riguarda il dimensionamento l'ultimo per riempire un'area lo faccio con un convertitore. Non penso che questo convertitore faccia esattamente ciò di cui hai bisogno per questo, ma dovrebbe farti iniziare.

<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 è veloce ma richiede un po 'di baby sitter.

+0

So che questo è piuttosto vecchio, ma voglio sottolineare, quanto è importante la tempistica della correzione di 'ColumnWidth' e che funziona davvero bene se applicata correttamente. Assicurarsi che il contenitore GridView sia caricato e visibile. Ho avuto una combinazione piuttosto brutta di un GridView inserito in un expander che era a sua volta parte di un controllo genitore virtualizzante. Significa che un ridimensionamento mentre si è fuori campo produrrebbe zero larghezza e gli articoli potrebbero cambiare quando il modello è stato riciclato per dati diversi. Ora sono abbastanza felice della mia soluzione. – grek40

Problemi correlati