ListBox прокручивается до конца при добавлении нового контента - PullRequest
0 голосов
/ 31 января 2011

У меня есть список, который связан с CollectionViewSource (поддерживается ObservableCollection).Когда я добавляю элементы в свою внутреннюю коллекцию, список автоматически прокручивает их в поле зрения.Как отключить это поведение?

<ListBox ItemsSource="{Binding}"
                 ScrollViewer.VerticalScrollBarVisibility="Hidden"
                 ScrollViewer.HorizontalScrollBarVisibility="Visible"
                 HorizontalContentAlignment="Center"
                 VerticalContentAlignment="Stretch">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0"
                                CanVerticallyScroll="False"
                                CanHorizontallyScroll="True"
                                />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>

РЕДАКТИРОВАТЬ: это с .NET 4.0, Visual Studio 2010. Такое поведение не происходит при использовании AddRange, но элементы стоят дорого, поэтому я добавляю их по одномувремя использования Dispatcher.Invoke для обеспечения отзывчивости интерфейса.

EDIT2: поскольку он был предложен три раза, я не использую VirtualizingStackPanel, потому что он виртуализируется «слишком сложно».Я считаю, что он выполняет больше работы, чем обычная панель стека, потому что, используя мой метод, все элементы создаются один раз, и пользовательский интерфейс отзывчивый.С панелью виртуализации приложение блокируется, когда новые элементы прокручиваются в поле зрения, и приостанавливается, чтобы создать еще несколько.Кроме того, существуют проблемы с элементами, которые не загружены и не получают события должным образом, и, если прокрутить слишком далеко, более ранние элементы, по-видимому, будут отброшены и будут созданы позднее.Поэтому я использую панель стека, где я избегаю всех этих проблем, за исключением начального времени загрузки, которое мне почти удалось преодолеть, сохранив этот вопрос.

1 Ответ

0 голосов
/ 03 марта 2011

Проверьте, что делают другие элементы. В этом случае добавленные мной элементы (стороннее программное обеспечение) имели ошибку, когда один из элементов вызывал RequestBringIntoView. Поскольку пользовательский интерфейс не мог обновляться между всеми этими вызовами, казалось, что окно списка должно было перейти к концу. Глотание события приводит к правильному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...