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?
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.
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.
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}" />
Setzen Sie die Eigenschaft columns Width
auf eine proportionale Breite wie *
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.)
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;
}
}
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.
setze die Breite EINER Spalte auf einen beliebigen Wert, d. h. width = "*"
Dadurch wird die letzte Spalte des XAML-Rasters nicht erweitert, um den verbleibenden Platz zu belegen, wenn AutoGeneratedColumns="True"
.
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