TreeView itemsHost.setScrollOffset переходит в конец списка, если смещение больше фактической высоты - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть TreeView с VirtualizingStackPanel.IsVirtualizing = "True", который заполнен примерно 1000 элементами. Если окно открыто, я хочу, чтобы TreeView имел заданный элемент c Выбранный элемент и, очевидно, нужно прокрутить вправо до него, чтобы он был видим для пользователя.

<TreeView x:Name="Tree" ItemsSource="{Binding VisibleItems}" SelectedItems="{Binding SelectedItems, Mode=TwoWay}" VirtualizingStackPanel.IsVirtualizing="True">

Итак, в ViewModel Я установил SelectedItem и запускаю этот код, чтобы получить itemHost и установить VerticalOffset

    //Get the itemsHost using Reflection
    Dim vsp As VirtualizingStackPanel = DirectCast(GetType(ItemsControl).InvokeMember("_itemsHost", BindingFlags.Instance Or BindingFlags.GetField Or BindingFlags.NonPublic, Nothing, tb, Nothing), VirtualizingStackPanel)

    Dim offset As Double = itemHeight * itemPosition
    vsp.SetVerticalOffset(offset)

И это работает так, как и ожидалось, оно прокручивается вниз к selectedItem ... для первых нескольких элементов. Как только смещение больше хоста ActualHeight, оно просто переходит прямо в конец списка.

В этом конкретном случае c ActualHeight равен 516.25. Если я вручную установлю смещение на 516, оно будет прекрасно работать, но если оно будет 517, оно будет для вас прямым. Буквально 1000 элементов находятся между смещением 516 и концом списка.

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

Есть ли какое-то исправление, я что-то не так делаю !?

...