.net - WPF में एक छवि खींचें



user-interface (1)

ठीक है, यहां एक संलग्न संपत्ति "व्यवहार" है जिसे आप किसी भी तत्व को खींचने योग्य बनाने के लिए उपयोग कर सकते हैं, जो इसे कैनवास पर है:

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

}

तब आप अपने एक्सएएमएल में इस नाम का उपयोग करके अपने वर्ग में शामिल नामों का उपयोग कर सकते हैं (ऐसा कुछ :)

<Window x:Class="WPFFunWithDragging.Window1"
        xmlns:local="clr-namespace:WPFFunWithDragging" .. >

और फिर आप बस DraggableExtender सेट कर सकते हैं। ConDrag = तत्वों पर "सच" चारों ओर खींचने के लिए:

<Canvas>
    <Image Source="Garden.jpg" 
           Width="50" 
           Canvas.Left="10" Canvas.Top="10" 
           local:DraggableExtender.CanDrag="true"/>
</Canvas>

आशा है कि यह कुछ उपयोग का है :)

मैं एक WPF अनुप्रयोग बनाने की कोशिश कर रहा हूं जहां मैं एक छवि को चारों ओर खींच सकता हूं।

वर्तमान में मेरे पास खिड़की के केंद्र में एक छवि है, और मैं छवि खींचते समय नई स्थिति की गणना करने के लिए माउस माउस, माउस माउस और माउसउप का इस्तेमाल करने की सोच रहा हूं।

क्या ऐसा करने के लिए कोई अन्य अच्छे विचार हैं? मैं पूरी तरह से WPF के लिए नया हूँ ताकि मेरी मानसिकता अभी भी विंडोज़ फ़ार्म्स दुनिया में है।

जहां तक ​​मैं देख सकता हूं, मुझे पूर्ण स्थिति निर्धारण उपलब्ध कराने के लिए एक का उपयोग करने की आवश्यकता है I





user-interface