顶级使用延迟滚动时嵌套ScrollViewers的行为不正确

时间:2011-03-04 21:12:20

标签: wpf nested scrollviewer

我有一个控件,其核心如下:

    <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中的一个错误,但我很难相信这是通过质量保证。如何在外部滚动条上进行延迟滚动,但内部滚动条没有延迟滚动,并且正确使用此功能?

1 个答案:

答案 0 :(得分:1)

刚才进入这个问题。这里有一个潜在的解决方案(最后,通过omdsmr):

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

它说:

  

我发现问题在于来自儿童滚动查看器的命令泄漏了#39;直到主滚动查看器。

     

您可以通过添加输入绑定来停止命令路由。

     

将此添加到主scrollviewer的任何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;
}

我自己从未尝试过这个。 Haven决定我是否要使用延迟滚动。