Как я могу уменьшить WPF ListView? - PullRequest
0 голосов
/ 01 апреля 2011

Хорошо, это действительно сводит меня с ума, и мне нужна помощь.

У меня есть просмотр списка с источником элементов, который имеет несколько столбцов gridview.Когда установлен ItemsSource, размер столбцов соответствует размеру содержимого.

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

Я переклассифицировал ListView для переопределения этого поведения и не могу заставить его работать правильно.

Я переопределил функцию MeasureOverride следующим образом:

    protected override Size MeasureOverride(Size constraint)
    {
            var size = base.MeasureOverride(constraint);

            var gv = this.View as GridView;

            if (gv != null)
            {
                var width = gv.Columns.Select(a => a.ActualWidth).ToArray();
                size.Width = gv.Columns.Sum(a => a.ActualWidth) ;
                if (scroll.ScrollableHeight > 0)
                    size.Width += SystemParameters.ScrollWidth;
            }

            return size;
    }

Что делаетвызвать уменьшение размера списка по желанию, но , если представление списка имеет вертикальную полосу прокрутки, оно исчезает. Я не могу понять, как заставить полосу прокрутки возвращаться программно.

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

Любая идея, что я должен делать, кроме как бросить пытаться?

Ответы [ 3 ]

0 голосов
/ 01 апреля 2011

Если я не ошибаюсь, ListView имеет свой собственный ScrollViewer, доступ к которому осуществляется через вложенные свойства, поэтому, если вы хотите изменить это в коде, вам, вероятно, нужно сделать это следующим образом:

lv.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty,
            ScrollBarVisibility.Visible);

Какую помощь я не знаю.

(lv - это экземпляр ListView, если вы находитесь в подклассе, вы, вероятно, просто будете использовать this)

0 голосов
/ 27 апреля 2011

Причина, по которой это даже является проблемой, заключается в том, что ScrollViewer по своей природе сохраняет размер содержимого, поэтому, когда ListView сокращается до MeasureOverride, его содержимое остается прежним.Решение ниже не является идеальным, но это лучшее, что я мог найти.Если есть лучший, пожалуйста, дайте мне знать.

Я пришел к решению, чтобы сохранить функцию MeasureOverride, как указано выше, а также переопределить ArrangeOverride и установить ширину ScrollViewer, чтобы она былаКонечная ширина ListView примерно так:

public Size ArrangeOverride(Size arrangeBounds)
{
  var size = base.ArrangeOverride(arrangeBounds);
  var scroll = GetScrollViewer();
  scroll.Width = size.Width;
  return size;
}
0 голосов
/ 01 апреля 2011

Я не уверен, есть ли лучший способ, только самый хитрый.

Вы можете иметь свойство зависимости в вашем коде позади, равное сумме ActualWidth всех ваших ListViewColumns плюс ширины прокрутки, если есть прокрутка и привязать свойство listView Width к этому свойству зависимости.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...