C# [WPF / ListView] ScrollViewer für mehrer ListViews in einer View ermitteln

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hallo Leute,

ich ermittel für eine ListView den ScrollViewer um die exakte vertikale Scrollposition zu erhalten:
  1. OnInizialized-Event verwenden und an Loaded-Event anmelden
  2. Loaded-Event => ScrollViewer ermitteln
  3. ScrollViewer ermitteln: VisualTreeHelper.GetChildrenCount()
  4. ScrollViewer != null: ScrollChanged-Event anmelden
  5. Scrollposition speichern
Für eine Liste funktioniert das so nun auch wunderbar.

Problem:
Ich benutze ein WPF TabControl:
Code:
<TabControl>...</TabControl>

Mit mehreren Tabs:
Code:
<TabItem></TabItem>

In jedem Tab steckt jetzt eine ListView. Theoretisch sollte der Ablauf der Events für jede ListView-Instanz wie oben dargestellt ablaufen.
Dies ist aber nicht der Fall. Beim Initialisieren der View / Tabs wird nur der Event-Ablauf der Liste korrekt abgearbeitet die in dem gerade aktiven Tab steckt.
Bei den anderen findet die VisualTreeHelper.GetChildrenCount()-Methode keine Elemente. Sprich der ist "ScrollViewer == null". Somit kann ich mit nicht an das ScrollChanged-Event anmelden. Also auch keine ScrollPosition ermitteln / setzten.

Kann mir jemand sagen, warum die VisualTreeHelper.GetChildrenCount() mir "0" zurück gibt?
 
Zuletzt bearbeitet:
Ein Objectlistview kommt nicht in Frage anstatt vieler Listviews in einzelnen Tabs?
 
Das TabControl lädt nur den Inhalt des aktiven Tabs. Wechselst du den Tab, wird der Content des alten Tab entladen (Unloaded-Event) und der Content des neuen Tabs geladen (Loaded-Event).
Du bekommst also keinen ScrollViewer für die inaktiven Tabs, weil keiner existiert.

Diese Verhalten kann man umgehen (z. B. Stop TabControl from recreating its children). Alternativ kann man auch die Loaded/Unloaded-Events des Tab-Contents verwenden.
 
Code:
      <TabControl ScrollViewer.ScrollChanged="ScrollViewer_OnScrollChanged"  >
            <TabItem>
                <ListView>
                    <sys:String>1</sys:String>
                    <sys:String>2</sys:String>
                    <sys:String>3</sys:String>
                </ListView>
            </TabItem>
            <TabItem>
                <ListView>
                    <sys:String>4</sys:String>
                    <sys:String>5</sys:String>
                    <sys:String>6</sys:String>
                </ListView>
            </TabItem>
        </TabControl>

Setze das Event doch einfach auf dem TabControl, dann müsste es gehen.
 
Zurück
Oben