listview.ScrollIntoView (listview.SelectedItem) не работает, когда повторяющиеся строки происходят в просмотре списка - PullRequest
0 голосов
/ 06 ноября 2019

WPF listview.ScrollIntoView (listview.SelectedItem) не работает, если элементы содержат дубликаты ссылок (встречаются повторяющиеся строки).

Я работаю над функциональностью FINDNEXT.

В моих строках списка просмотра данные повторяются. Когда появляется повторяющаяся строка, она прокручивается до первого вхождения дубликата.

Как прокрутить до нужного элемента в ListView?

private void Listview_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    listview.UpdateLayout();
    listview.ScrollIntoView(listview.SelectedItem);

}

1 Ответ

0 голосов
/ 06 ноября 2019

Это решение требует, чтобы виртуализация была отключена, лучше, как предлагал Клеменс, - клонируйте дубликаты, поскольку они являются разными объектами, и вы можете использовать свой подход.

private static DependencyObject FirstVisualChild(UIElement visual)
{
    if (visual == null)
        return null;
    if (VisualTreeHelper.GetChildrenCount(visual) == 0)
        return null;
    return VisualTreeHelper.GetChild(visual, 0);
}

private void Listview_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var itmFromIdx = listView.ItemContainerGenerator.ContainerFromIndex(listView.SelectedIndex);

    ScrollContentPresenter presenter = null;
    for (var vis = itmFromIdx as UIElement; vis != null; vis = VisualTreeHelper.GetParent(vis) as UIElement)
        if ((presenter = vis as ScrollContentPresenter) != null)
            break;
    if (presenter == null)
        throw new Exception();

    var virtStackPnl = FirstVisualChild(presenter.Content as ItemsPresenter);//VirtualizingStackPanel

    (virtStackPnl as IScrollInfo).MakeVisible(itmFromIdx as UIElement, new Rect(new Size(0, 0)));
}

XAML:

<ListView x:Name="listView" ... VirtualizingPanel.IsVirtualizing="False">
...