Вложение ScrollViewers, когда верхний уровень использует отложенную прокрутку, ведет себя неправильно - PullRequest
0 голосов
/ 05 марта 2011

У меня есть элемент управления, который по своей сути выглядит так:

    <ListBox ScrollViewer.CanContentScroll="True"
             ScrollViewer.IsDeferredScrollingEnabled="True" Name="w_Carousel">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal"
                                        CanVerticallyScroll="False"
                                        CanHorizontallyScroll="True"
                                        />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>

Содержит объекты, которые сами могут иметь прокручиватель. Упрощенно они выглядят так:

    <ScrollViewer Width="160"
                  HorizontalScrollBarVisibility="Visible"
                  IsDeferredScrollingEnabled="False">
    <Label>THIS IS SOME REALLY LONG TEXT AND EVEN MORE </Label>
    </ScrollViewer>

Когда я хватаю полосу прокрутки для внутреннего контроля, реагирует внешний. Что с этим? Похоже, ошибка в WPF, но мне было бы трудно поверить, что это произошло через QA. Как мне отложить прокрутку на внешней полосе прокрутки, но чтобы внутренняя прокрутка не имела отложенной прокрутки, и правильно ли работала эта функция?

1 Ответ

1 голос
/ 04 ноября 2011

Наткнулся на это сам только сейчас. Здесь есть потенциальное решение (в конце, по omdsmr):

http://social.msdn.microsoft.com/Forums/en/wpf/thread/f95f4727-5e84-48da-b153-973128292172

Там написано:

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

Вы можете остановить маршрутизацию команд, добавив привязку ввода.

Добавьте это к любому потомку UIElement основного просмотрщика, который также является предком для всех дочерних наблюдателей прокрутки:

<UIElement.CommandBindings>
<CommandBinding
 Command="{x:Static ScrollBar.DeferScrollToVerticalOffsetCommand}"
 CanExecute="OnDeferScrollToOffsetExecuted" />
<CommandBinding
 Command="{x:Static ScrollBar.DeferScrollToHorizontalOffsetCommand}"
  CanExecute="OnDeferScrollToOffsetExecuted" />
</UIElement.CommandBindings>

Тогда этот обработчик в коде:

void OnDeferScrollToOffsetExecuted(object sender, CanExecuteRoutedEventArgs e)
{
 e.Handled = true;
}

Я никогда сам этого не пробовал. Не решил, хочу ли я использовать отложенную прокрутку.

...