2012-11-29 10 views
11

Ich habe ein DataGrid mit vielen Spalten.WPF DataGrid Spaltenbreite Auto und Bildlaufleiste

Ich möchte Width="Auto" mit Bildlaufleiste zeigen alles, wenn Fenster schmaler als alle Spalten. Wenn das Fenster breiter ist, möchte ich, dass Spalten den leeren Raum überspannen, so dass es keinen Totraum gibt.

Grundsätzlich möchte ich die Spalte minimale Breite vollständig Inhalt oder Header anpassen. Und erweitern Sie zu größeren, wenn das Fenster breiter ist.

+0

können Sie nach, was XAML Sie bisher haben? –

+0

Wenn die Breite auf auto eingestellt ist, wird die Bildlaufleiste nie angezeigt. –

+0

@ EduardoBrites modifizierte Frage, um weitere Erläuterungen hinzuzufügen – Brent

Antwort

8

In XAML festlegen Datagrid ColumnWidth="Auto"

In Usercontrol-Konstruktor

dataGrid.Loaded += (s, e) => { // Column widths 
    dataGrid.Columns.AsParallel().ForEach(column => { 
     column.MinWidth = column.ActualWidth; 
     column.Width = new DataGridLength(1, DataGridLengthUnitType.Star); 
    }); 
}; 

Mit diesem mit einem benutzerdefinierten Datagrid hinzuzufügen und funktioniert super.

+0

posten Sie könnten auch auf die TextRenderer.MeasureText-Eigenschaft schauen und die Minwidth gleich setzen. –

+0

-1 wird nicht mit Standard WPF und .NET 4.5 kompilieren; nicht viel zu sagen, es funktioniert mit einem ** benutzerdefinierten ** ** Datagrid **, wenn der Code nicht geliefert wird – MickyD

+2

-1 auch ** AsParallel() ** ist in der Regel ein großes Nein Nein beim Umgang mit GUI-Elementen – MickyD

22

Um alle horizontalen Raum in WPF zu „füllen“ DataGrid wie angegeben, stellen Sie sicher, dass Sie diese Eigenschaften in XAML gesetzt haben:

<DataGrid 
    HorizontalAlignment="Stretch" 
    HorizontalContentAlignment="Stretch" 
    ColumnWidth="*" /> 
+2

ColumnWidth = "*" funktioniert großartig :) –

+2

Diese Lösung verhindert, dass das Raster eine horizontale Bildlaufleiste erhält, falls es nicht breit genug ist, um den Inhalt aller Spalten anzupassen. – dlf