it-swarm.com.ru

Как сделать так, чтобы XAML DataGridColumns заполнял всю DataGrid?

Я использую DataGrids в XAML (не Silverlight) с изменяемыми размерами столбцов, DataGrid будет расширяться, если пользователь изменяет размер экрана.

В настоящее время, если ширина всех столбцов DataGrid меньше ширины DataGrid, появляется дополнительный "столбец", который не может быть кликабелен и не имеет смысла.

Кто-нибудь знает, как заставить один столбец всегда изменять размер, чтобы заполнить все оставшееся пространство?

107
Purplegoldfish

Если вы используете Width="*", колонка заполнится, чтобы расширить доступное пространство.

Если вы хотите, чтобы все столбцы делили сетку в равной степени, примените это ко всем столбцам. Если вы хотите, чтобы один из них заполнил оставшееся пространство, просто примените его к этому столбцу, оставив "Авто" или определенную ширину.

Вы также можете использовать Width="0.25*" (например), если хотите, чтобы столбец занимал 1/4 доступной ширины.

224
ChrisF

Убедитесь, что в вашей DataGrid Width установлено что-то вроде {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Таким образом, ваша настройка атрибута Width="*" для элементов DataGrid.Columns/DataGridXXXXColumn должна работать.

15
MStack

Как уже отмечалось, ColumnWidth="*" прекрасно работал для DataGrid в XAML.

Я использовал это в этом контексте:

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

Установите для свойства Width столбцов пропорциональную ширину, например *

6
devdigital

Я добавил HorizontalAlignment = "Center" (по умолчанию "Strech"), и это решило мою проблему, потому что это сделало сетку данных настолько широкой, насколько это необходимо. (Удалена настройка ширины сетки данных, если она у вас есть.)

enter image description here

1
JBrooks

Еще одно вращение на ту же тему:

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

установите ширину ОДНОГО столбца в любое значение, то есть width = "*"

1
alkk

Для тех, кто ищет обходной путь в C #:

Если по какой-то причине вам нужно включить "AutoGeneratedColumns", вы можете указать одну ширину всех столбцов, кроме тех, для которых вы хотите автоматически изменять размер (это будет не занимать оставшееся пространство , но это будет изменить размер содержимого ячейки).

Пример (dgShopppingCart - это моя 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; 

Для меня это работает как обходной путь, потому что мне нужно было изменить размер DataGrid, когда пользователь развернул окно.

0
Exel Gamboa

Это не расширит последний столбец сетки xaml, чтобы занять оставшееся пространство, если AutoGeneratedColumns="True".

0
pramod