2011-03-04 62 views
0

我有一个在它的核心是这样的控制:嵌套ScrollViewers正确

<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中。简单来说,它们看起来像这样:

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

当我抓住内部控件的滚动条时,外部控件响应。这是怎么回事?它看起来像WPF中的错误,但我很难相信这通过了QA。我如何在外部滚动条上进行延迟滚动,但让内部滚动条没有延迟滚动,并且正确地使用此功能?

回答

1

刚刚进入这个。有一个潜在的解决方案在这里(在年底,omdsmr):

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

它说:

我发现的问题是,从孩子scrollviewers“泄漏”到命令主scrollviewer。

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

这个添加到主ScrollViewer中的任何的UIElement后裔,这也是一个祖先所有的孩子scrollviewers的:

<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; 
} 

我从来没有尝试过这个我自己呢。还没有决定是否要使用延迟滚动。

+0

为我工作,谢谢。 – 2011-11-15 12:15:23