ScrollViewer内の特定のControlを画面上に固定する方法
指定したIDを持つControlをScrollViewerの先頭にピン止めしたいのですが、どのような方法を取れば対象となるUIElementの表示位置を固定できるでしょうか?
動きの例としては、以下の様なイメージです。
ItemsSource
にObservableCollection<int>
をBindingしたListView
に、1~1000の数値がTextBlock
で縦方向のリストとして表示されている- 1~1000が表示された
TextBlock
は、一定時間ごとにランダムに順番が入れ替わる - ユーザーは特定の番号を
TextBox
への入力などで指定すると、その番号の表示されたTextBlock
がぴったりListView
の一番上に表示され、その番号の順番が入れ替わっても、その状況が保持されつづける(=自動的に適切な位置にスクロールする)
ListView.ItemContainerGenerator.ContainerFromItem(...)
で取得したVisual
をVisual.PointToScreen(...)
で変換して、その位置にScrollViewer.ScrollToVerticalOffset(...)
をすれば…
という事を考えたのですが、順番入れ替えを検知する方法がINotifyCollectionChanged
しか見つからず、CollectionChanged
イベントを起点にUIElementを取ろうとするとVisualTree
の作成途中なのか、上手くコントロールを取得できませんでした。
このような場合に上手く機能を実現するには、どのような方法があるでしょうか?