2012-04-04 16 views
0

Also, ich bin mit diesem Ansatz der Lage sein, ein Bild ziehen:Ziehen Bild ihn innerhalb der Mutter

Dragging an image in WPF

Und funktioniert großartig, aber das Problem ist, es auf einer Leinwand hängt aber es zieht und zieht das Bild außerhalb der Leinwand. Dies ist der Extender, den ich verwende, ist es möglich, sich auf die ursprüngliche Leinwandgröße zu beschränken.

Was ich tun möchte, ist in der Lage zu sein (innerhalb der ursprünglichen Leinwandgröße) das Bild zu ziehen, um Teile zu sehen, die am Anfang nicht sichtbar sind.

Extender

public class DraggableExtender : DependencyObject 
    { 
     // This is the dependency property we're exposing - we'll 
     // access this as DraggableExtender.CanDrag="true"/"false" 
     public static readonly DependencyProperty CanDragProperty = 
      DependencyProperty.RegisterAttached("CanDrag", 
      typeof(bool), 
      typeof(DraggableExtender), 
      new UIPropertyMetadata(false, OnChangeCanDragProperty)); 

     // The expected static setter 
     public static void SetCanDrag(UIElement element, bool o) 
     { 
      element.SetValue(CanDragProperty, o); 
     } 

     // the expected static getter 
     public static bool GetCanDrag(UIElement element) 
     { 
      return (bool)element.GetValue(CanDragProperty); 
     } 

     // This is triggered when the CanDrag property is set. We'll 
     // simply check the element is a UI element and that it is 
     // within a canvas. If it is, we'll hook into the mouse events 
     private static void OnChangeCanDragProperty(DependencyObject d, 
        DependencyPropertyChangedEventArgs e) 
     { 
      UIElement element = d as UIElement; 
      if (element == null) return; 

      if (e.NewValue != e.OldValue) 
      { 
       if ((bool)e.NewValue) 
       { 
        element.PreviewMouseDown += element_PreviewMouseDown; 
        element.PreviewMouseUp += element_PreviewMouseUp; 
        element.PreviewMouseMove += element_PreviewMouseMove; 
       } 
       else 
       { 
        element.PreviewMouseDown -= element_PreviewMouseDown; 
        element.PreviewMouseUp -= element_PreviewMouseUp; 
        element.PreviewMouseMove -= element_PreviewMouseMove; 
       } 
      } 
     } 

     // Determine if we're presently dragging 
     private static bool _isDragging = false; 
     // The offset from the top, left of the item being dragged 
     // and the original mouse down 
     private static Point _offset; 

     // This is triggered when the mouse button is pressed 
     // on the element being hooked 
     static void element_PreviewMouseDown(object sender, 
       System.Windows.Input.MouseButtonEventArgs e) 
     { 
      // Ensure it's a framework element as we'll need to 
      // get access to the visual tree 
      FrameworkElement element = sender as FrameworkElement; 
      if (element == null) return; 

      // start dragging and get the offset of the mouse 
      // relative to the element 
      _isDragging = true; 
      _offset = e.GetPosition(element); 
     } 

     // This is triggered when the mouse is moved over the element 
     private static void element_PreviewMouseMove(object sender, 
        MouseEventArgs e) 
     { 
      // If we're not dragging, don't bother - also validate the element 
      if (!_isDragging) return; 

      FrameworkElement element = sender as FrameworkElement; 
      if (element == null) return; 

      Canvas canvas = element.Parent as Canvas; 
      if (canvas == null) return; 

      // Get the position of the mouse relative to the canvas 
      Point mousePoint = e.GetPosition(canvas); 

      // Offset the mouse position by the original offset position 
      mousePoint.Offset(-_offset.X, -_offset.Y); 

      // Move the element on the canvas 
      element.SetValue(Canvas.LeftProperty, mousePoint.X); 
      element.SetValue(Canvas.TopProperty, mousePoint.Y); 
     } 

     // this is triggered when the mouse is released 
     private static void element_PreviewMouseUp(object sender, 
       MouseButtonEventArgs e) 
     { 
      _isDragging = false; 
     } 

    } 

Antwort

1

Vielleicht hier Basis Ich bin vervollständigen weg, aber ich denke, das Problem in der XAML Ihrer Canvas ist und nicht in Ihrem Extender.

Haben Sie die Eigenschaft ClipToBounds = "True" in Ihrem Canvas-Objekt festgelegt, da sie für ein Canvas-Objekt standardmäßig auf false festgelegt ist.

<Canvas ClipToBounds="True" /> 
+0

Rhyous du bist der Chef! Dank bro! Eigentlich war das das Problem. –

Verwandte Themen