Как заставить ItemContainerGenerator генерировать контейнер для элемента или Как прокрутить TreeView до расширенного узла, когда включена виртуализация пользовательского интерфейса?

В TreeView нет метода ScrollIntoView()
Единственный способ — вызвать TreeVewItem.BringIntoView() для соответствующего контейнера элемента данных.
Но если узел невидим и контейнер еще не создан, ItemsControl.ItemContainerGenerator.ContainerFromItem() вернет null.

Поэтому должен быть какой-то способ заставить ItemContainerGenerator создать контейнер для элемента.

Резонный вопрос: Как узел может быть расширен и оставаться невидимым?!

Легкий! IsExpanded привязан к свойству виртуальной машины. И виртуализация пользовательского интерфейса работает должным образом:
обработчик событий для TreeViewItem.Expanded вызывался каждый раз, когда выполнялась ручная прокрутка к элементу.


person Pavel Voronin    schedule 06.02.2013    source источник


Ответы (1)


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

Я работаю с элементом управления Canvas, и у меня есть сложные элементы пользовательского интерфейса, размещенные на этом холсте, и элементы управления ItemsControl являются частью их определений пользовательского интерфейса XAML. Элементы ItemsControl определили набор DataTemplates в своих ItemTemplates.

Из-за этого некоторые аспекты моих объектов будут полностью сгенерированы только после обновления визуального дерева. Это не проблема перетаскивания элементов и работы с ними во время работы с холстом, потому что ItemContainerGenerator уже сгенерировал элементы, когда они мне нужны. Но это проблема при попытке регенерировать элементы из базы данных во время загрузки Canvas до того, как визуальное дерево отрисовывается.

Я обнаружил, что единственный реальный способ обойти эту проблему — начать работать над размещением «вторичных объектов» на холсте (объектов, которые связаны с объектами, созданными ItemContainerGenerators) только после того, как событие LayoutUpdated для холста был уволен.

public class DesignerCanvas : Canvas
{
  public void LoadCanvasFromDB()
  {
    ...
    [loading items from the database, part one]
    LayoutUpdated += DesignerCanvas_LayoutUpdated;
  }

  void DesignerCanvas_LayoutUpdated(object sender, EventArgs e)
  {
    LayoutUpdated -= DesignerCanvas_LayoutUpdated;
    [loading items from the database which tie to UI elements from part one]
person James Eby    schedule 06.04.2013