2011-03-04 140 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