2010-10-04 96 views
2

我有一個ItemsControl,其中包含ScrollViewer中的畫布。畫布很大,一次只顯示一部分。我想以編程方式滾動它(用戶點擊並拖動畫布滾動)。我查看了ScrollViewer方法,並在鼠標事件處理程序中嘗試了以下操作:WPF以編程方式滾動項目控件中的畫布

var scrollViewer = (sender) as ScrollViewer; 
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX); 
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY); 

但是,這無影響。我檢查了deltaX和deltaY的值,它們是有效值(如3,5等)。即使在執行上述命令後,HorizontalOffsetVerticalOffset始終保持爲0。

這是我的XAML:

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" 
       MouseUp="ScrollViewer_MouseUp" MouseMove="ScrollViewer_MouseMove" 
       PreviewMouseLeftButtonDown="ScrollViewer_PreviewMouseLeftButtonDown" Background="Transparent"> 
     <ItemsControl ItemsSource="{Binding BubbleVMCollection}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <!-- My template here --> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
      <ItemsControl.ItemContainerStyle> 
       <Style> 
        <Setter Property="Canvas.Left" Value="{Binding AbsoluteLeft}" /> 
        <Setter Property="Canvas.Top" Value="{Binding AbsoluteTop}" /> 
       </Style> 
      </ItemsControl.ItemContainerStyle> 
     </ItemsControl> 
</ScrollViewer> 

任何幫助/建議表示讚賞!

回答

1

它工作正常(的ScrollViewer滾動) :

<ScrollViewer Name="scrollViewer" 
     VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" 
      MouseUp="ScrollViewer_MouseUp" MouseMove="ScrollViewer_MouseMove" 
      PreviewMouseLeftButtonDown="ScrollViewer_PreviewMouseLeftButtonDown" Background="Transparent"> 
     <ItemsControl ItemsSource="{Binding BubbleVMCollection}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas Width="5000" Height="5000"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <!-- My template here --> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
      <ItemsControl.ItemContainerStyle> 
       <Style> 
        <Setter Property="Canvas.Left" Value="{Binding AbsoluteLeft}" /> 
        <Setter Property="Canvas.Top" Value="{Binding AbsoluteTop}" /> 
       </Style> 
      </ItemsControl.ItemContainerStyle> 
     </ItemsControl> 
    </ScrollViewer> 

和後面的代碼:

Point capturePoint { get; set; } 

    private void ScrollViewer_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { 
     scrollViewer.CaptureMouse(); 
     capturePoint = e.MouseDevice.GetPosition(scrollViewer); 
    } 

    private void ScrollViewer_MouseUp(object sender, MouseButtonEventArgs e) { 
     scrollViewer.ReleaseMouseCapture(); 
    } 

    private void ScrollViewer_MouseMove(object sender, MouseEventArgs e) { 
     if (!scrollViewer.IsMouseCaptured) return; 
     Point currentPoint = e.MouseDevice.GetPosition(scrollViewer); 
     var deltaX = capturePoint.X - currentPoint.X; 
     var deltaY = capturePoint.Y - currentPoint.Y; 
     scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + deltaX); 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + deltaY); 
    } 

你能發表一些你遇到的問題的更多細節嗎?

+0

哈哈,答案是在你的XAML。我想我必須明確指定寬度和高度。真棒,謝謝:) – Aishwar 2010-10-05 01:26:03

+0

你不應該真的。在我的xaml中,對我進行這種測試更容易。但是,如果它適合你,那麼就這樣吧。 – 2010-10-05 05:59:48

0

另一個潛在的解決方案...用於一個TreeView,但不明白爲什麼代碼應該在你的情況下無法正常工作:在我的測試應用

Programmatically scrolling a TreeView