Bagaimana cara memaksa ItemContainerGenerator menghasilkan wadah untuk item atau Bagaimana cara menggulir TreeView ke node yang diperluas ketika virtualisasi UI diaktifkan?

TreeView tidak memiliki metode ScrollIntoView()
Satu-satunya cara adalah memanggil TreeVewItem.BringIntoView() untuk penampung item data terkait.
Namun jika simpul tidak terlihat dan belum ada penampung yang dibuat, ItemsControl.ItemContainerGenerator.ContainerFromItem() akan mengembalikan null.

Jadi harus ada cara untuk memaksa ItemContainerGenerator membuat wadah untuk item tersebut.

Pertanyaan yang masuk akal adalah: Bagaimana cara node diperluas dan tetap tidak terlihat?!

Mudah! IsExpanded terikat pada properti VM. Dan virtualisasi UI berfungsi seperti yang diharapkan:
Pengendali peristiwa untuk TreeViewItem.Expanded dipanggil hanya ketika pengguliran manual ke item telah selesai.


person Pavel Voronin    schedule 06.02.2013    source sumber


Jawaban (1)


Saya tidak dapat menjamin masalah ini cukup mirip untuk membantu, tapi saya pikir karena saya tidak dapat menemukan jawaban yang baik untuk masalah saya sendiri, saya akan memposting di sini karena ini serupa dan saya menemukan cara untuk mengatasi masalah saya.

Saya bekerja dengan kontrol Canvas dan memiliki elemen UI kompleks yang ditempatkan di kanvas tersebut dan memiliki kontrol ItemsControl sebagai bagian dari definisi UI XAMLnya. ItemsControl telah menetapkan DataTemplates yang ditetapkan dalam ItemTemplates mereka.

Oleh karena itu, aspek tertentu dari objek saya hanya akan dihasilkan sepenuhnya setelah Pohon Visual diperbarui. Ini bukan masalah menyeret dan melepas serta mengerjakan item saat kanvas sedang dikerjakan karena ItemContainerGenerator telah membuat item saat saya membutuhkannya. Namun ini menjadi masalah saat mencoba membuat ulang item dari database pada waktu buka Canvas sebelum pohon visual digambar sendiri.

Saya menemukan satu-satunya cara nyata untuk mengatasi masalah ini adalah dengan mulai bekerja menempatkan "objek sekunder" di kanvas (objek yang terikat dengan objek yang dibuat oleh ItemContainerGenerators) setelah acara LayoutUpdated untuk kanvas telah dipecat.

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