Определите цвет фона чередующихся строк TreeView на основе видимости - PullRequest
3 голосов
/ 06 августа 2010

Есть ли способ в WPF определить фон чередующихся видимых строк?

Я попытался установить свойство AlternationCount, но оно перезапускается для каждого дочернего узла, который выглядит странно.

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

Ответы [ 2 ]

4 голосов
/ 12 августа 2010

Не было простого способа сделать это, поскольку WPF создает вложенные контейнеры для узлов дерева.Так что, как упоминала Рэйчел, путь к предметам, похоже, был подходящим.Но я не хотел слишком сильно отклоняться от встроенного свойства ItemsControl.AlternationIndex, поскольку это то, чего люди ожидают.Поскольку он доступен только для чтения, я должен был получить к нему доступ через отражение, но после этого все стало на свои места.

Прежде всего, убедитесь, что вы обрабатываете события Loaded, Expanded и Collapsed вашего TreeViewItem.В обработчике событий найдите принадлежащий TreeView и выполните набор счетчиков рекурсивных чередований для всех видимых узлов.Я создал метод расширения для его обработки:

  public static class AlternationExtensions
  {

    private static readonly MethodInfo SetAlternationIndexMethod;

    static AlternationExtensions()
    {
        SetAlternationIndexMethod = typeof(ItemsControl).GetMethod(
        "SetAlternationIndex", BindingFlags.Static | BindingFlags.NonPublic);
    }

    public static int SetAlternationIndexRecursively(this ItemsControl control, int firstAlternationIndex)
    {
        var alternationCount = control.AlternationCount;
        if (alternationCount == 0)
        {
            return 0;
        }

        foreach (var item in control.Items)
        {
            var container = control.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
            if (container != null)
            {
                var nextAlternation = firstAlternationIndex++ % alternationCount;
                SetAlternationIndexMethod.Invoke(null, new object[] { container, nextAlternation });
                if (container.IsExpanded)
                {
                    firstAlternationIndex = SetAlternationIndexRecursively(container, firstAlternationIndex);
                }
            }
        }

        return firstAlternationIndex;
    }
}

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

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

0 голосов
/ 06 августа 2010

Что-то, что я сделал с javascript, это создание события OnLoaded для таблицы, которая циклически перебирает строки таблицы и, если строка видима, устанавливает цвет фона для переменной nextColor и изменяет переменную nextColor на противоположный цвет,Это может сработать здесь.

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