изменение размера последнего столбца таблицы данных - PullRequest
3 голосов
/ 02 июля 2011

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

Как бы вы это сделали?

Приветствия
Berryl

... CanUserResizeColumns = "True" >

    <DataGrid.Columns>
        <DataGridTextColumn 
            Header="Number" Binding="{Binding BusinessId}" IsReadOnly="True" 
            CanUserSort="True" CanUserResize="False"
            Width="75"/>
        <DataGridTextColumn 
            Header="Description" Binding="{Binding Description}" IsReadOnly="True" 
            CanUserSort="True" SortDirection="Ascending" CanUserResize="True"
            MinWidth="260" Width="Auto"  />
    </DataGrid.Columns>

</DataGrid>

ОБНОВЛЕНИЕ (рабочий код)

Я просто назвал столбец в xaml и поместил следующий код в код позади. Если у кого-то есть идея получше или способ ее оптимизации, пожалуйста, дайте мне знать!

public partial class Listing : UserControl
{
    private double _currentColumnWidth;

    public Listing()
    {
        InitializeComponent();

        Loaded += OnLoaded;
        SizeChanged += OnSizeChanged;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        _currentColumnWidth = colDescription.ActualWidth;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        // split if control is not loaded yet
        if (_currentColumnWidth == 0) return;

        // only interested in width, not height
        var widthChanged = e.WidthChanged;
        if (!widthChanged) return;

        var delta = e.NewSize.Width - e.PreviousSize.Width;
        var newWidth = _currentColumnWidth + delta;
        if (newWidth <= colDescription.MinWidth || newWidth >= colDescription.MaxWidth) return;

        _currentColumnWidth = newWidth;
        colDescription.Width = new DataGridLength(_currentColumnWidth);
    }
}

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Легко, просто замените свойство width в вашем XAML

<DataGridTextColumn 
                Header="Description" Binding="{Binding Description}" 
                IsReadOnly="True" 
                CanUserSort="True" SortDirection="Ascending" CanUserResize="True"
                MinWidth="260" Width="Auto"  />

на ...

<DataGridTextColumn 
                Header="Description" Binding="{Binding Description}" IsReadOnly="True" 
                CanUserSort="True" SortDirection="Ascending" CanUserResize="True"
                MinWidth="260" Width="*"  />

Вам не требуется никакого кода для обработки ширины какWPF учитывает это в XAML.

"*" обозначает значение AutoSize:)

1 голос
/ 04 июля 2011

Я упростил код из моего исходного сообщения «обновление» и исправил ошибку, которая была в нем. Предложение Джейсона использовать размер "*" проще, и поэтому его следует использовать, когда сетка не находится внутри UserControl, но я не знаю лучшего способа сохранить размер столбца должным образом, когда он находится внутри UserControl.

Приветствия
Berryl

В приведенном ниже коде предполагается, что существует именованный DataGrid (т. Е. DgProject) и именованный столбец (т. Е. ColDescription), размер которого необходимо изменить при изменении размера элемента управления.

public partial class Listing : UserControl
{

    public Listing()
    {
        InitializeComponent();

        SizeChanged += OnSizeChanged;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        // split if control is not loaded yet
        if (!dgProject.IsLoaded) return;

        // only interested in width, not height
        if (!e.WidthChanged) return;

        var delta = e.NewSize.Width - e.PreviousSize.Width;
        var newWidth = colDescription.ActualWidth + delta;
        if (newWidth <= colDescription.MinWidth || newWidth >= colDescription.MaxWidth) return;

        colDescription.Width = new DataGridLength(newWidth);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...