it-swarm.com.de

Wie lasse ich XAML DataGridColumns das gesamte DataGrid ausfüllen?

Ich verwende DataGrids in XAML (nicht Silverlight) mit anpassbaren Spalten. Das DataGrid wird erweitert, wenn der Benutzer die Größe des Bildschirms ändert.

Derzeit wird, wenn die Breite aller DataGrid-Spalten geringer ist als die Breite des DataGrid, eine zusätzliche "Spalte" angezeigt, die nicht angeklickt werden kann und keinen Zweck erfüllt.

Weiß jemand, wie man eine Spalte immer die Größe neu bestimmt, um den ganzen restlichen Raum zu füllen?

109
Purplegoldfish

Wenn du benutzt Width="*" Die Spalte wird gefüllt, um den verfügbaren Speicherplatz zu erweitern.

Wenn Sie möchten, dass alle Spalten das Raster gleichmäßig teilen, wenden Sie dies auf alle Spalten an. Wenn Sie nur möchten, dass einer den verbleibenden Platz ausfüllt, wenden Sie ihn einfach auf diese Spalte an, wobei der Rest "Auto" oder eine bestimmte Breite ist.

Sie können auch Width="0.25*" (zum Beispiel), wenn die Spalte 1/4 der verfügbaren Breite einnehmen soll.

230
ChrisF

Stellen Sie sicher, dass in Ihrem DataGrid Width auf {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}} Festgelegt ist.

Auf diese Weise sollte Ihre Einstellung des Attributs Width="*" Für DataGrid.Columns/DataGridXXXXColumn - Elemente funktionieren.

16
MStack

Wie bereits erwähnt, ist der ColumnWidth="*" hat für ein DataGrid in XAML einwandfrei funktioniert.

Ich habe es in diesem Zusammenhang benutzt:

<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
7

Setzen Sie die Eigenschaft columns Width auf eine proportionale Breite wie *

6
devdigital

Ich habe HorizontalAlignment = "Center" (die Standardeinstellung ist "Strech") hinzugefügt und mein Problem wurde dadurch behoben, dass das Datagrid nur so breit wie nötig wurde. (Die Einstellung für die Breite des Datagrids wurde entfernt, wenn Sie eine haben.)

enter image description here

1
JBrooks

Ein weiterer Dreh zum selben Thema:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    dataGrid.Width = e.NewSize.Width - (e.NewSize.Width * .1);

    foreach (var column in dataGrid.Columns)
    {
       column.Width = dataGrid.Width / dataGrid.Columns.Count;
    }
 }
1
Steve

Für diejenigen, die eine C # -Umgehung suchen:

Wenn Sie aus irgendeinem Grund die Option "AutoGeneratedColumns" aktivieren müssen, können Sie alle Spaltenbreiten mit Ausnahme derjenigen angeben, deren Größe Sie automatisch ändern möchten (dies wird nicht den verbleibenden Platz beanspruchen , aber es wird Größe an den Inhalt der Zelle anpassen).

Beispiel (dgShopppingCart ist mein DataGrid):

dgShoppingCart.Columns[0].Visibility = Visibility.Hidden; 
dgShoppingCart.Columns[1].Header = "Qty";
dgShoppingCart.Columns[1].Width = 100;
dgShoppingCart.Columns[2].Header = "Product Name"; /*This will be resized to cell content*/
dgShoppingCart.Columns[3].Header = "Price";
dgShoppingCart.Columns[3].Width = 100;
dgShoppingCart.Columns[4].Visibility = Visibility.Hidden; 

Bei mir funktioniert dies als Problemumgehung, da die Größe des DataGrid geändert werden musste, wenn der Benutzer das Fenster maximiert.

0
Exel Gamboa

setze die Breite EINER Spalte auf einen beliebigen Wert, d. h. width = "*"

0
alkk

Dadurch wird die letzte Spalte des XAML-Rasters nicht erweitert, um den verbleibenden Platz zu belegen, wenn AutoGeneratedColumns="True".

0
pramod

Meine 2 Cent ->

Sehr spät zum Feiern

DataGrid -> Column -> Width = "*" funktioniert nur, wenn der übergeordnete DataGrid-Container eine feste Breite hat.

beispiel: Ich habe das DataGrid in Grid -> Column eingefügt, dessen Breite = "Auto", dann Width = "*" in DataGrid nicht funktioniert. Wenn Sie jedoch Grid -> Column Width = "450" ​​festlegen, funktioniert dies einwandfrei

0