2010-09-28 7 views
0

Y at-il quelqu'un qui a expérimenté avec le composant scrollviewer dans WPF? J'ai un zoom de sélection de base, et le problème est qu'il ne défile pas au bon endroit.WPF: Zoom et faire défiler jusqu'à la sélection (exemple)

sortie, en essayant de zoomer la fleur: alt text

En fait, le RectangleZoom (voir ci-dessous) méthode redimensionne l'image, mais il ne se concentre pas sur le rectangle spécifié, mais toujours dans la même position .. . Je crois qu'il ya un moyen de faire défiler à cette position, mais jusqu'à présent, aucun succès ....

Voici mon code: XAML:

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <ScrollViewer x:Name="scrollViewer" 
        HorizontalScrollBarVisibility="Auto"> 
     <Canvas Height="200" Name="mainCanvas" Width="400" 
       MouseLeftButtonDown="mainCanvas_MouseLeftButtonDown" 
       MouseLeftButtonUp="mainCanvas_MouseLeftButtonUp" 
       MouseMove="mainCanvas_MouseMove"> 
      <Canvas.Background> 
       <ImageBrush ImageSource="/WpfApplication3;component/Images/natural-doodle.jpg"/> 
      </Canvas.Background> 
      <Canvas.LayoutTransform> 
       <TransformGroup> 
        <ScaleTransform x:Name="scaleTransform"/> 
       </TransformGroup> 
      </Canvas.LayoutTransform> 
     </Canvas> 
    </ScrollViewer> 
</Window> 

code derrière:

public partial class MainWindow : Window 
{ 
    private Point startPoint; 
    private Point endPoint; 
    private Shape rubberBand; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void mainCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     if (!mainCanvas.IsMouseCaptured) 
     { 
      startPoint = e.GetPosition(mainCanvas); 
      Mouse.Capture(mainCanvas); 
     } 
    } 

    private void mainCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (mainCanvas.IsMouseCaptured) 
     { 
      if (rubberBand != null) 
      { 
       this.RectangleZoom(
        Canvas.GetLeft(rubberBand), 
        Canvas.GetTop(rubberBand), 
        rubberBand.Width, 
        rubberBand.Height); 

       mainCanvas.Children.Remove(rubberBand); 
       rubberBand = null; 
       mainCanvas.ReleaseMouseCapture(); 
      } 
     } 
    } 

    private void mainCanvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (mainCanvas.IsMouseCaptured) 
     { 
      endPoint = e.GetPosition(mainCanvas); 
      if (rubberBand == null) 
      { 
       rubberBand = new Rectangle(); 
       rubberBand.Stroke = Brushes.Red; 
       rubberBand.StrokeDashArray = new DoubleCollection(new double[] { 4, 2 }); 
       mainCanvas.Children.Add(rubberBand); 
      } 

      rubberBand.Width = Math.Abs(startPoint.X - endPoint.X); 
      rubberBand.Height = Math.Abs(startPoint.Y - endPoint.Y); 

      double left = Math.Min(startPoint.X, endPoint.X); 
      double top = Math.Min(startPoint.Y, endPoint.Y); 

      Canvas.SetLeft(rubberBand, left); 
      Canvas.SetTop(rubberBand, top); 
     } 
    } 


    private void RectangleZoom(double x, double y, double width, double height) 
    { 
     double rWidth = scrollViewer.ViewportWidth/width; 
     double rHeight = scrollViewer.ViewportHeight/height; 
     double rZoom = 1.0; 

     if (rWidth < rHeight) 
      rZoom = rWidth; 
     else 
      rZoom = rHeight; 

     scaleTransform.ScaleX = rZoom; 
     scaleTransform.ScaleY = rZoom; 
    } 
} 

Répondre

3

Vous avez tout, mais trois lignes:

Ajouter ce au fond de votre méthode de RetangleZoom:

Point newXY = scaleTransform.Transform(new Point(x, y)); 
    scrollViewer.ScrollToHorizontalOffset(newXY.X); 
    scrollViewer.ScrollToVerticalOffset(newXY.Y); 
+0

... oh mon Dieu ... si juste une échelle de transformation sur le point ... vraiment cool merci! Au fait, j'ai passé quelques heures ...: ") – serhio

+0

par ailleurs ... est-il possible de garder la taille de la bande de caoutchouc non décalée lors de ces transformations? L'élastique en grande échelle est devenu énorme! – serhio

Questions connexes