Фиксированная ширина WPF GridViewColumnHeader

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

Один из элементов управления похож на ListView в WPF, а текстовый файл может содержать набор столбцов со своими свойствами. Одно из этих свойств указывает, должен ли столбец иметь фиксированную ширину, которую WPF не обеспечивает автоматически.

Изображение говорит за тысячу слов, поэтому вот пример проанализированного файла, содержащего ListView с четырьмя столбцами:

Основной макет

Для простоты я использовал раскраску в демонстрационных целях. Первый столбец с красным текстом — это столбец с фиксированной шириной.

Для этого во время синтаксического анализа каждый GridViewColumnHeader получает Style, который сам по себе может быть изменен в зависимости от флагов (например, "IsFixed"), содержащихся в свойствах для ту колонку.

Чтобы исправить ширину столбца, я создал Style, который добавляет к стилю установщики MinWidth и MaxWidth. Обратите внимание, что ColumnResize — это настраиваемое перечисление.

private void _ModifyColumnResize(ref Style style, ColumnResize columnResize, int width)
{
    if (columnResize == ColumnResize.IsFixed)
    {
        var minWidth = new Setter(MinWidthProperty, (double)width);
        var maxWidth = new Setter(MaxWidthProperty, (double)width);
        var fixedColor = new Setter(ForegroundProperty, Brushes.Red);

        style.Setters.Add(minWidth);
        style.Setters.Add(maxWidth);
        style.Setters.Add(fixedColor);
    }
}

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

После изменения размера

Как видите, сам столбец имеет одинаковую ширину, но слева и справа от столбца появляется отступ, что нежелательно.

Мой вопрос: могу ли я остановить это поведение с помощью стиля? В идеале я не хотел бы, чтобы захват был виден для столбца, который не позволяет изменять размер, но я не уверен, как это сделать, поскольку Style будет создан в программном коде (во время синтаксический анализ), а не в xaml.

Спасибо за ваше время!


person user3235445    schedule 08.10.2014    source источник
comment
Вы сказали: «В идеале я бы не хотел, чтобы захват был виден для столбца, который не позволяет изменять размер». Хотели узнать, какие операции разрешено выполнять пользователю с заголовками столбцов в вашем приложении?   -  person DareToExplore    schedule 08.10.2014
comment
Привет, они должны иметь возможность сортировать и переназначать макет столбца (перетаскивание), что я не вижу в проблеме. Проблема на данный момент заключается в том, что в старых элементах управления они могли сказать, что столбец имеет фиксированную ширину, отсюда и вопрос. Спасибо.   -  person user3235445    schedule 08.10.2014
comment
Вы проверили это. В соответствии с вашим сценарием, я думаю, вам нужно изменить шаблон управления заголовком столбца. Мы не можем отключить заголовок, так как пользователь будет взаимодействовать с заголовком для других целей (сортировка/перетаскивание/удаление)   -  person DareToExplore    schedule 08.10.2014
comment
Чтобы установить этот пользовательский стиль для заголовка в вашем парсере, вы можете определить требуемый стиль в ресурсах приложения и установить его в свойстве ColumnHeaderContainerStyle элемента управления. Эта ссылка может помочь.   -  person DareToExplore    schedule 08.10.2014
comment
С вашей помощью я нашел способ сделать это. Я просто собираюсь прибраться, а затем вскоре напишу ответ здесь с кредитом на вас.   -  person user3235445    schedule 08.10.2014


Ответы (1)


Благодаря @DareToExplore вот решение:

Я взял копию шаблона по умолчанию для GridViewColumnHeader из MSDN и удалил часть PART_HeaderGripper. Этот стиль не используется по умолчанию для каждого столбца и должен использоваться только для столбца, размер которого не должен изменяться.

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

Для столбца с неизменяемым размером я беру ресурс Style из App.xaml, затем назначаю этот стиль свойству HeaderContainerStyle этого GridViewColumnHeader. нравится:

if (parsedColumn.ColumnResize == ColumnResize.IsFixed)
{
    var style = this.FindResource("GridViewColumnHeader_NoResize");
    gridViewColumn.HeaderContainerStyle = style as Style;
}

Пока я оставлю стиль в App.xaml и буду использовать его по мере необходимости.

Я надеюсь, что это достаточно подробно, и это поможет кому-то на этом пути.

Еще раз спасибо @DareToExplore!

person user3235445    schedule 08.10.2014
comment
Рад, что смог помочь. Вы можете принять это как свой ответ. - person DareToExplore; 08.10.2014
comment
Видимо, мне нужно подождать до завтра, чтобы принять это, поэтому я подожду день! Я надеюсь, что вы получите кредит за это, спасибо еще раз. - person user3235445; 09.10.2014
comment
В порядке. Кредит - Что ж, ваше "спасибо" - это кредит для меня. Что касается кредита очков стека, я не думаю, что какие-либо баллы будут зачислены. Это потому, что я не опубликовал ответ, который вы могли бы принять. Я просто направлял тебя. Я не уверен, что вы можете проголосовать за комментарии, и это что-то добавит. - person DareToExplore; 09.10.2014
comment
Как новичок в WPF, не могли бы вы опубликовать соответствующий ресурс xaml? - person David; 11.05.2016