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?

Purplegoldfish
quelle

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.

ChrisF
quelle
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.

MStack
quelle
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}" />
Peripherie Stille
quelle
7

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

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

Muhammad Waqas Aziz
quelle
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;
    }
 }
Steve
quelle
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

JBrooks
quelle
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".

Pramod
quelle
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 = "*"

alkk
quelle
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.

Exel Gamboa
quelle