2010-10-04 6 views
2

J'ai un ItemsControl qui contient un canevas dans un ScrollViewer. La toile est grande et seule une partie de celle-ci s'affiche à la fois. Je veux le faire défiler par programmation (l'utilisateur clique et fait glisser la toile pour faire défiler). Je regardais à travers les méthodes ScrollViewer et essayé les éléments suivants dans les gestionnaires d'événements de souris:WPF Défilement programmé d'un canevas dans un contrôle d'articles

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

Cependant, cela ne fait rien. J'ai vérifié les valeurs de deltaX et deltaY et ce sont des valeurs valides (comme 3, 5 etc.). Les HorizontalOffset et VerticalOffset restent 0 à tout moment, même après l'exécution des lignes ci-dessus.

Voici mon 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> 

Toute aide/suggestions sont appréciés!

Répondre

1

Il fonctionne très bien (rouleaux ScrollViewer) dans ma demande de test :

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

et le code derrière de:

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

Pourriez-vous poster plus de détails sur le problème que vous rencontrez?

+0

Haha, la réponse est dans votre XAML. Je suppose que je dois spécifier explicitement la largeur et la hauteur. Génial, merci :) – Aishwar

+0

Vous ne devriez pas avoir vraiment. Dans mon xaml, c'était plus facile pour moi de tester de cette façon. Mais si cela fonctionne pour vous, alors faites-le. –

Questions connexes