【问题标题】:Drag and drop images on canvas在画布上拖放图像
【发布时间】:2026-01-26 18:00:01
【问题描述】:

我已将图像拖放到画布上。我已经修复了边界,这样我的图像就不会拖出画布,但是当我放大和缩小图像时,它的边界会发生变化,并且不会拖到整个画布上。我已经尝试过了。

         public void Btnedit_Click(object sender, RoutedEventArgs e)
         {
        var button = sender as Button;
        button.IsEnabled = false;
        CompositeTransform CT = new CompositeTransform();
        ImgeracOpen.ManipulationMode = ManipulationModes.All;
        //ImgeracOpen.ManipulationDelta += Drag_ManipulationDelta;
        ImgeracOpen.ManipulationDelta += Composite_ManipulationDelta;
        ImgeracOpen.RenderTransform = CT;
    }

   void Composite_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        // scale the image

        FrameworkElement Elem = sender as FrameworkElement;
        CompositeTransform CT = Elem.RenderTransform as CompositeTransform;
        if (CT != null)
        {
            CT.ScaleX *= e.Delta.Scale;
            CT.ScaleY *= e.Delta.Scale;
            CT.CenterX = Elem.ActualWidth / 2;
            CT.CenterY = Elem.ActualHeight / 2;
            if (CT.ScaleX < 0.25) CT.ScaleX = 0.25;
            if (CT.ScaleY < 0.25) CT.ScaleY = 0.25;
            if (CT.ScaleX > 1.15) CT.ScaleX = 1.15;
            if (CT.ScaleY > 1.15) CT.ScaleY = 1.15;

        }

        double Left = Canvas.GetLeft(Elem);
        double Top = Canvas.GetTop(Elem);
        Left += e.Delta.Translation.X;//Get x cordinate 
        Top += e.Delta.Translation.Y;//Get y cordinate 
        //check for bounds 
        if (Left < 0)
        {
            Left = 0;
        }
        else if (Left > (my_canvas.ActualWidth - Elem.ActualWidth))
        {
            Left = my_canvas.ActualWidth - Elem.ActualWidth;
        }

        if (Top < 0)
        {
            Top = 0;
        }
        else if (Top > (my_canvas.ActualHeight - Elem.ActualHeight))
        {
            Top = my_canvas.ActualHeight - Elem.ActualHeight;
        }

        Canvas.SetLeft(Elem, Left);
        Canvas.SetTop(Elem, Top);

提前致谢

【问题讨论】:

    标签: c# canvas uwp


    【解决方案1】:

    当我放大和缩小图像时,它的边界会改变,它不会拖到整个画布上。

    这是因为当您缩放图像时,图像的ActualWidthActualHeight 不会改变,您从Canvas.GetLeftCanvas.GetTop 得到的LeftTop 也不会改变。

    要解决此问题,您需要在图像缩放如下时计算LeftTop 值:

    如图所示。当图像缩放时,Left 值应该是Canvas.Width-Image.ActualWidth-xOffset 当图像到达右边界时。当它到达左边界时Left 应该等于xOffset

    通过这个逻辑,Composite_ManipulationDelta中的代码应该修改如下:

    void Composite_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        // scale the image
        FrameworkElement Elem = sender as FrameworkElement;
        CompositeTransform CT = Elem.RenderTransform as CompositeTransform;
        if (CT != null)
        {
            CT.ScaleX *= e.Delta.Scale;
            CT.ScaleY *= e.Delta.Scale;
            CT.CenterX = Elem.ActualWidth / 2;
            CT.CenterY = Elem.ActualHeight / 2;
            //if (CT.ScaleX < 0.25) CT.ScaleX = 0.25;
            //if (CT.ScaleY < 0.25) CT.ScaleY = 0.25;
            //if (CT.ScaleX > 1.15) CT.ScaleX = 1.15;
            //if (CT.ScaleY > 1.15) CT.ScaleY = 1.15;
        }
        double Left = Canvas.GetLeft(Elem);
        double Top = Canvas.GetTop(Elem);
    
        //output.Text = "Left:=" + Left + "  Top:=" + Top+"\nActualWidth:="+Elem.Width+"  ActualHeight"+Elem.Height;
        Left += e.Delta.Translation.X;//Get x cordinate 
        Top += e.Delta.Translation.Y;//Get y cordinate 
                                         //check for bounds
        double xOffset = Elem.ActualWidth * (CT.ScaleX-1) / 2;
        double yOffset = Elem.ActualHeight * (CT.ScaleY-1) / 2; 
        if (Left-xOffset < 0)
        {
            Left = xOffset;
        }
        else if (Left > (my_canvas.ActualWidth - Elem.ActualWidth-xOffset))
        {
            Left = my_canvas.ActualWidth - Elem.ActualWidth-xOffset;
        }
    
        if (Top -yOffset<0 )
        {
            Top = yOffset;
        }
        else if (Top > (my_canvas.ActualHeight - Elem.ActualHeight-yOffset))
        {
            Top = my_canvas.ActualHeight - Elem.ActualHeight-yOffset;
        }
    
        Canvas.SetLeft(Elem, Left);
        Canvas.SetTop(Elem, Top);
    }
    

    【讨论】: