C# 避免Windows窗体在调整大小时裁剪图像

C# 避免Windows窗体在调整大小时裁剪图像,c#,wpf,image,crop,rendertransform,C#,Wpf,Image,Crop,Rendertransform,我目前正在开发一个工具,可以在不同的窗口中打开多个图像。主要目标是能够分别移动/调整窗体和图像的大小。 这是一个非常简单的表单,包含一个边框,包含一个图像。 我可以使用变换组平移和缩放图像,一切正常 我的问题是,如果我将窗口的大小调整为小于图像的大小,然后将图像移到窗口内,则在调整大小后不可见的图像部分将被裁剪,并且只能在调整窗口本身的大小时才能检索。 同样,如果我减小图像大小,然后减小窗口大小,图像将被裁剪 所以我想知道是什么因素导致了这种行为,有没有办法摆脱它?或者要求表单首先不要裁剪图像,

我目前正在开发一个工具,可以在不同的窗口中打开多个图像。主要目标是能够分别移动/调整窗体和图像的大小。 这是一个非常简单的表单,包含一个边框,包含一个图像。 我可以使用变换组平移和缩放图像,一切正常

我的问题是,如果我将窗口的大小调整为小于图像的大小,然后将图像移到窗口内,则在调整大小后不可见的图像部分将被裁剪,并且只能在调整窗口本身的大小时才能检索。 同样,如果我减小图像大小,然后减小窗口大小,图像将被裁剪

所以我想知道是什么因素导致了这种行为,有没有办法摆脱它?或者要求表单首先不要裁剪图像,或者在翻译图像时重新绘制图像

XAML


编辑: 以下是图像的平移和缩放代码(如果相关):

private void image_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (Keyboard.IsKeyDown(Key.LeftCtrl))
        {

            double zoom = e.Delta > 0 ? 0.1 : -0.1;
            if ((e.Delta < 0) && (scaleT.ScaleX < 0.2 || scaleT.ScaleY < 0.2))
            { return; }


            Point relative = e.GetPosition(image);
            //Point absolute = new Point(0,0);

            double absoluteX = relative.X * scaleT.ScaleX + translateT.X;
            double absoluteY = relative.Y * scaleT.ScaleY + translateT.Y;

            scaleT.ScaleX += zoom;
            scaleT.ScaleY += zoom;

            translateT.X = absoluteX - relative.X * scaleT.ScaleX;
            translateT.Y = absoluteY - relative.Y * scaleT.ScaleY;
        }
}

 private void image_MouseMove(object sender, MouseEventArgs e)
    {

        if (image.IsMouseCaptured)
        {


            translateT.X = origin.X - (start.X - e.GetPosition(border).X);
            translateT.Y = origin.Y - (start.Y - e.GetPosition(border).Y);


        }

    }
private void image\u鼠标滚轮(对象发送器,鼠标滚轮事件参数e)
{
if(Keyboard.IsKeyDown(Key.LeftCtrl))
{
双变焦=e.增量>0?0.1:-0.1;
if((e.Delta<0)和&(scaleT.ScaleX<0.2 | | scaleT.ScaleY<0.2))
{return;}
点相对=e.GetPosition(图像);
//绝对点=新点(0,0);
双绝对X=相对X*scaleT.ScaleX+translateT.X;
双重绝对=相对.Y*scaleT.ScaleY+translateT.Y;
scaleT.ScaleX+=缩放;
scaleT.ScaleY+=缩放;
translateT.X=绝对X-相对X*scaleT.ScaleX;
translateT.Y=绝对-相对.Y*scaleT.ScaleY;
}
}
私有无效图像\u MouseMove(对象发送器,MouseEventArgs e)
{
if(image.IsMouseCaptured)
{
translateT.X=origin.X-(start.X-e.GetPosition(border.X);
translateT.Y=origin.Y-(start.Y-e.GetPosition(border.Y);
}
}

很难说您什么时候没有向我们展示代码的相关部分。我没有放代码,因为我认为这可能更多的是关于表单行为或wpf如何处理图像对象的问题。我在原来的问题中加了它。
private void image_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (Keyboard.IsKeyDown(Key.LeftCtrl))
        {

            double zoom = e.Delta > 0 ? 0.1 : -0.1;
            if ((e.Delta < 0) && (scaleT.ScaleX < 0.2 || scaleT.ScaleY < 0.2))
            { return; }


            Point relative = e.GetPosition(image);
            //Point absolute = new Point(0,0);

            double absoluteX = relative.X * scaleT.ScaleX + translateT.X;
            double absoluteY = relative.Y * scaleT.ScaleY + translateT.Y;

            scaleT.ScaleX += zoom;
            scaleT.ScaleY += zoom;

            translateT.X = absoluteX - relative.X * scaleT.ScaleX;
            translateT.Y = absoluteY - relative.Y * scaleT.ScaleY;
        }
}

 private void image_MouseMove(object sender, MouseEventArgs e)
    {

        if (image.IsMouseCaptured)
        {


            translateT.X = origin.X - (start.X - e.GetPosition(border).X);
            translateT.Y = origin.Y - (start.Y - e.GetPosition(border).Y);


        }

    }