2010-08-04 4 views
28

Quale sarebbe il modo migliore/diritto di avere una serie di DataGrid colonne hanno larghezza proporzionale (Width="\*"), ma per avere la loro larghezza minima essere almeno la larghezza del loro contenuto? al momento, se uso Width="*", quindi le colonne rimanere esattamente proporzionale, ma il contenuto viene ritagliata se le colonne diventano troppo sottile. Se uso Width="Auto", quindi le colonne stesse tg perfettamente al loro contenuto, ma questoWPF - Colonna DataGrid con width = "*", ma MinWidth per adattarsi al contenuto

Quello che voglio è davvero una combinazione dei due, come Width="\*", MinWidth="Auto" in modo che quando c'è larghezza extra le colonne saranno tutte spazio a larghezza uguale, ma quando la griglia viene ridotta, il contenuto non viene mai ritagliato.

Purtroppo, MinWidth="Auto" non esiste, quindi suppongo di dover associare la proprietà MinWidth della colonna, ma è difficile capire esattamente a cosa collegerei.

Come dico WPF "MinWidth=" la larghezza della più ampia parte del contenuto della colonna?

+1

Abilitarci a impostare MinWidth = "auto" sarebbe una bella funzionalità. –

risposta

11

Set Width = "Auto" in XAML.

Poi nel codice:

MinWidth = ActualWidth 
Width = new GridLength(1, GridUnitType.Star) 
+1

Ha funzionato per me. Passa attraverso tutte le colonne della griglia ed esegui il codice sopra in tutte loro. inserire il loop in un gestore per l'evento Loaded della griglia – saus

+0

mi ci è voluto un po 'per capire anche con questo aiuto. Vedere la mia risposta su http://stackoverflow.com/questions/13631694/wpf-datagrid-column-width-auto-and-scrollbar – Brent

18

So che è un po 'tardi, ma ho trovato la tua domanda e programmato una soluzione pura-XAML.

<ColumnDefinition Width="42*" MinWidth="{Binding Path=ActualWidth, ElementName=projectInfoHeader }"/> 

Dove le ElementName punti al controllo prendendo la maggior parte dello spazio. Ovviamente questo è possibile solo con gli elementi, che hanno una larghezza limitata. Se lo si fa, ad esempio per un GroupBox, che è possibile ridimensionare solo per la larghezza più grande e mai ridimensionare al più piccolo.

Se si dispone di diversi candidati per il valore di MinWidth, è necessario per scrivere un IMultiValueConverter, che prende un oggetto [], analizza ai carri, e restituisce il massimo (la sua interrogazione appena 1 LINQ se lo si utilizza solo voi stessi e non hanno bisogno di gestire l'utilizzo inappropriato del convertitore)

in questo modo supporta anche il cambio dinamico del MinWidth.

1

Dare la colonna un nome nel XAML:

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" Name="Col1"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
</Grid> 

quindi impostare la proprietà MinWidth nel codice come illustrato di seguito:

public MainWindow() 
{ 
    InitializeComponent(); 

    Col1.MinWidth = 340; //enter desired minimum width here 
} 
+0

è possibile aggiungere Minwidth e Maxwidth come attributo di colonna. Non c'è bisogno di aggiungere tocco al codice –

2

Ho anche avuto modo corretto problemi alle dimensioni colonne della griglia all'interno della GridViewColumn. C'erano diverse cose che ho provato, ma poi ho trovato l'UniformGrid. Era la soluzione definitiva per me. Funziona e basta. Non lo sapevo prima ... sembra che non esista in VS toolbox di default (?) E quindi non lo sapeva nemmeno esiste.

È possibile trovare maggiori informazioni su UniformGrid da here.

0

Semplicemente è possibile utilizzare sotto codice per impostare la larghezza massima o minima della colonna

<ColumnDefinition Width="*" MaxWidth="40"/> 

Questo avrà lo spazio a disposizione, ma limiterà al massimo 40px

si può fare lo stesso con MinWidth anche

<ColumnDefinition Width="*" MinWidth="50"/> 

Questo richiederà lo spazio disponibile ma si assicurerà sempre che abbia almeno uno spazio di 50 px. Spero che questo aiuti.