Как заставить ItemContainerGenerator создать контейнер для элемента или Как прокрутить TreeView на расширенный узел, когда включена виртуализация пользовательского интерфейса?
TreeView не имеет ScrollIntoView()
метод
Единственный способ позвонить TreeVewItem.BringIntoView()
для соответствующего контейнера элемента данных.
Но если узел невидим и контейнер еще не создан, ItemsControl.ItemContainerGenerator.ContainerFromItem()
вернусь null
,
Поэтому должен быть способ заставить ItemContainerGenerator создать контейнер для элемента.
Резонный вопрос: как расширить узел и остаться невидимым?!
Легко! IsExpanded
связан с собственностью В.М. И виртуализация пользовательского интерфейса работает как положено:
Обработчик событий для TreeViewItem.Expanded вызывался только при ручной прокрутке элемента.
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]