Избегайте формы Windows, чтобы обрезать изображение при изменении размера

В настоящее время я работаю над инструментом, который позволяет открывать несколько изображений в разных окнах. Основная цель состоит в том, чтобы иметь возможность перемещать / изменять размеры формы и изображения по отдельности. Это очень простая форма, содержащая рамку, содержащую изображение. Я могу панорамировать и масштабировать изображение с помощью группы трансформации, и все работает отлично.

Моя проблема заключается в том, что если я изменю размер окна до меньшего размера, чем изображение, а затем перемещаю изображение внутри окна, часть изображения, которая не была видна после изменения размера, обрезается и может быть получена только при изменении размера окна сам. Таким же образом, если я уменьшу размер изображения, а затем уменьшу размер окна, изображение будет обрезано.

Поэтому мне интересно, какой элемент вызывает такое поведение, и есть ли способ избавиться от него? Либо попросив форму не обрезать изображение в первую очередь, либо перерисовать его при переводе?

XAML

<Window x:Class="Toolboxproto.imgWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="imgWindow" Height="300" Width="300"
    ShowInTaskbar="False"
    WindowStyle="None" 
    MouseLeftButtonDown="Window_MouseLeftButtonDown" 
    Activated="Window_Activated" 
    SizeChanged="Window_SizeChanged" 
    ResizeMode="CanResizeWithGrip" MouseWheel="Window_MouseWheel"
    >

<Border x:Name="border" ClipToBounds="True" Background="Gray" >
 <Image x:Name="image" 
  HorizontalAlignment="Center" 
  Height="290" 
  VerticalAlignment="Center" 
  Width="290" 
  MouseLeftButtonDown="image_MouseLeftButtonDown" 
  MouseWheel="image_MouseWheel" 
  MouseMove="image_MouseMove" 
  MouseLeftButtonUp="image_MouseLeftButtonUp" 
/>

Скриншоты

Изменить: Вот код для перевода и масштаба изображения, если это уместно:

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


        }

    }

0 ответов

Другие вопросы по тегам