Изменение размеров окна WPF DataGrid не приводит к изменению размера DataGridColumns - PullRequest
2 голосов
/ 28 апреля 2010

У меня есть WPF DataGrid (из пакета WPFToolkit), как показано ниже в моем приложении.

<Controls:DataGrid>
            <Controls:DataGrid.Columns>
                <Controls:DataGridTextColumn Width="1*" Binding="{Binding Path=Column1}" Header="Column 1" />
                <Controls:DataGridTextColumn Width="1*" Binding="{Binding Path=Column2}" Header="Column 2" />
                <Controls:DataGridTextColumn Width="1*" Binding="{Binding Path=Column3}" Header="Column 3" />
    </Controls:DataGrid.Columns>
</Controls:DataGrid>

Ширина столбца должна автоматически настраиваться таким образом, чтобы все три столбца заполняли ширину сетки, поэтому я устанавливаю Width="1*" для каждого столбца. С этим подходом я столкнулся с двумя проблемами.

  1. Когда ItemsSource DataGrid равен null или пустой список, столбцы не будут иметь размер, соответствующий ширине сетки, но будут иметь фиксированную ширину около 20 пикселей. Пожалуйста, смотрите следующую картинку: http://img169.imageshack.us/img169/3139/initialcolumnwidth.png
  2. Когда я максимизирую окно приложения, столбцы не меняют свой размер, но сохраняют свой первоначальный размер. Смотрите следующую картинку: http://img88.imageshack.us/img88/9362/columnwidthaftermaximiz.png
  3. При изменении размера окна приложения с помощью мыши размеры столбцов не изменяются.

Мне удалось решить проблему # 3, выведя подкласс из DataGrid и переопределив метод DataGrid OnRenderSizeChanged следующим образом.

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    base.OnRenderSizeChanged(sizeInfo);
    foreach (var column in Columns)
    {
        var tmp = column.GetValue(DataGridColumn.WidthProperty);
        column.ClearValue(DataGridColumn.WidthProperty);
        column.SetValue(DataGridColumn.WidthProperty, tmp);
    }
}

К сожалению, это не решает проблемы № 1 и № 2. Как мне от них избавиться?

Ответы [ 4 ]

2 голосов
/ 18 мая 2011

У меня точно такая же проблема, как и у вас, но вместо прослушивания RenderSizeChanged я прослушал событие SizeChanged, и оно учитывает все ваши ситуации.

dataGrid.SizeChanged += (sender_, arg_) =>
        {
          foreach (var dataGridColumn in dataGrid.Columns)
          {
            DataGridLength dataGridLength = dataGridColumn.Width;
            dataGridColumn.ClearValue(DataGridColumn.WidthProperty);
            dataGridColumn.Width = dataGridLength;
          }
        };
0 голосов
/ 13 сентября 2018

All DataGridTextColumn имеет свойство MinWidth по умолчанию, установленное в 20. Поэтому, если вы хотите контролировать ширину после изменения размера от максимального до минимального, вы должны указать это значение самостоятельно. Мое предложение:

    <DataGridTextColumn Header="Perfect&#x0a;column" Binding="{Binding SomeMember}" MinWidth="120" Width="120*"/>    
0 голосов
/ 02 ноября 2010

Следующее переопределение исправляет проблему размера для увеличивающейся ширины, включая максимизацию. Но все еще не проблема размера восстановления.

protected override void OnChildDesiredSizeChanged(UIElement e)
{
    base.OnChildDesiredSizeChanged(e);

    if (e.FindChild<DataGrid>() != null)
    {
        foreach (var column in dataGridMain.Columns)
        {
            var tmp = column.GetValue(DataGridColumn.WidthProperty);
            column.ClearValue(DataGridColumn.WidthProperty);
            column.SetValue(DataGridColumn.WidthProperty, tmp);
        }
    }
}

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

0 голосов
/ 07 мая 2010

Я также столкнулся с той же проблемой, что и вы заявили. Я немного искал в интернете и, возможно, нашел решение. Решение на самом деле работает для меня правильно. Установите значение * из кода C #. Вот фрагмент кода,

dg.Coulmns [0] .Width = new DataGridLength (1.0, DatGridLengthUnitType.Star);

Он установит ширину 0-го столбца на *. Не забудьте удалить Width = "1 **" со страницы XAML.

Наслаждайся Гуру.

...