Wie kann ich dafür sorgen, dass XAML DataGridColumns das gesamte DataGrid ausfüllen?


116

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

Wenn derzeit die Breite aller DataGrid-Spalten kleiner als die Breite des DataGrid ist, wird eine zusätzliche "Spalte" angezeigt, die nicht anklickbar ist und keinen Zweck erfüllt.

Weiß jemand, wie man eine Spalte immer in der Größe ändert, um den gesamten verbleibenden Platz zu füllen?

Antworten:


247

Wenn Sie Width="*"die Spalte verwenden, wird sie 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, der Rest ist "Auto" oder eine bestimmte Breite.

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


2
und wie mache ich ähnliche Dinge, wenn ich benutze AutoGenerateColumns="True"?
Javapowered

1
@javapowered - Ich würde vorschlagen, Ihre eigene Frage zu stellen und auf diese zu verweisen.
ChrisF

16
@ Javapowered<DataGrid AutoGenerateColumns="True" ColumnWidth="*" ItemsSource={Binding} />
Xavier

11
@ MohamedSakherSawan funktioniert es tatsächlich für Datagrid. Sowohl ColumnWidth="*"auf dem DataGrid als auch Width="*"auf den einzelnen Spalten hat der gewünschte Effekt
Steve

1
Gibt einen Fehler Sting kann nicht in '*' konvertiert werden
co2f2e

18

Stellen Sie sicher, dass Ihr DataGrid Widthauf so etwas wie eingestellt ist {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Auf diese Weise sollte Ihre Width="*"Attributeinstellung für DataGrid.Columns/DataGridXXXXColumnElemente funktionieren.


9

Wie bereits erwähnt, ist die ColumnWidth="*" funktionierte das für ein DataGrid in XAML einwandfrei.

Ich habe es in diesem Zusammenhang verwendet:

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

7

Stellen Sie die Spalteneigenschaft Widthauf eine proportionale Breite ein, z*


3

Mein 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 width = "Auto" und dann Width = "*" in DataGrid nicht funktionieren. Wenn Sie jedoch Grid -> Column Width = "450" ​​festlegen, funktioniert es einwandfrei


2

Ein weiterer Dreh zum gleichen 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

Ich habe ein HorizontalAlignment = "Center" hinzugefügt (der Standardwert ist "Strech") und es hat mein Problem gelöst, da das Datagrid nur so breit wie nötig war. (Die Einstellung für die Breite des Datagrids wurde entfernt, falls vorhanden.)

Geben Sie hier die Bildbeschreibung ein


In Kombination mit der ausgewählten Antwort und dieser Antwort löste es das Problem für mich. Ich musste die Breite auf dem Datagrid selbst entfernen. Vielen Dank.
Bryan Harrington

0

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


Ich habe die AutoGenerateColumns entfernt, obwohl die Spalten nicht über die gesamte Breite des Datenrasters / Bildschirms geteilt oder gestreckt sind. Ich habe die entsprechende Zeile des Rasters als "*" und für die Spaltenbreite ist keine Breite angegeben (entweder "auto" oder "irgendein Wert"). Aber immer noch habe ich die Probleme, hier ist der XAML-Code meines Designs pastie.org/10085815
GK

0

Setzen Sie die Breite EINER Spalte auf einen beliebigen Wert, dh width = "*"


0

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

Wenn Sie aus irgendeinem Grund müssen aktiviert die „AutoGeneratedColumns“ zu haben, eine Sache , die Sie tun können , ist es, alle Spalten der Breite mit Ausnahme derjenigen geben Sie sein Auto wollen der Größe verändert (es wird den verbleibenden Platz nicht nehmen , aber es wird auf die Größe ändern Inhalt der Zelle ).

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; 

Für mich funktioniert dies als Problemumgehung, da ich die Größe des DataGrid ändern musste, wenn der Benutzer das Fenster maximierte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.