Как заставить XAML DataGridColumns заполнить весь DataGrid?


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

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

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

9 101

9 ответов:

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

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

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

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

так, Настройки на DataGrid.Columns/DataGridXXXXColumn элементы должны работать.

установить колонки Width свойство быть пропорциональной ширины, таких как *

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

я использовал его в данном контексте:

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

установите ширину одного столбца в любое значение, т. е. width="*"

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

enter image description here

еще один спин на ту же тему:

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;
        }

    }

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

для тех, кто ищет обходной путь 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 изменяется, когда пользователь разворачивает окно.