Переведите координату, чтобы сохранить пропорцию при изменении размера холста в WPF для VB.Net - PullRequest
0 голосов
/ 08 марта 2019

Я создаю инструмент для работы с изображениями в WPF (VB.Net).

Я реализовал преобразование изображений и масштабирование в управлении изображениями с помощью Image RenderTransform.

На самом деле, Imageнаходится внутри Canvas элемента управления, как Photoshop Canvas .И внутри этого Canvas элемента управления есть Image, как Layer в Photoshop .

Что я хочу сделать, это когда я изменяю размер внешнего Canvas элемента управления,Image внутри также должен быть изменен и изменен, так как внешний элемент управления .Это означает, что изображение должно получить 'новую ширину, новую высоту, новый x (или offset-x или left), new y (или offset-y или top)'

Но, насколько я знаю,Удивительно, но RenderTransform фактически не меняет Image расположение и размер!Что означает, предположим, что есть фото 10х20.Если я увеличил изображение в два раза, то оно выглядит как 20х40.Но свойства Width, ActualWidth, RenderedSize.Width все они показывают 10x20 - исходный размер.

Более того, хотя я панорамирую (переводю или перемещаю) Image в пределах Canvas, влево (или Canvas.Left) вообще не изменяется!


В итоге,

  1. Image элемент управления в Canvas элементе управления
  2. MoveImage внутри Canvas с помощью мыши - выполняется RenderTransform
  3. Изменение размера "Image (не Canvas)" внутри Canvas - выполняется ScaleAtPrepend и RenderTransform тоже.
Измените размеры внешнего Canvas -> и оно должно охватывать внутреннее Image, которое будет изменено (как s на 1,5 с на рисунке) с таким же соотношением внешних Canvas,и левый и верхний (или смещение x, y) изображения, которое нужно перевести (или переместить) в соответствии с правильной переменной (например, x, y до 1,5x, 1,5y на рисунке) .

К сожалению, использование коэффициента масштабирования, такого как «1,5», кажется нежизнеспособным, поскольку исходная точка (x, y) всегда (0,0), потому что RenderTransform не меняет местоположениесами ценности.

С чего мне начать?Как я могу заставить его работать?

Заранее спасибо.

Helping Image

Вот дизайн XAML.

        <Canvas x:Name="CanvasBoard"  ClipToBounds="True"  Background="#FFC1C1C1" >

            <Image x:Name="CanvasImage" HorizontalAlignment="Left" VerticalAlignment="Top" MouseLeftButtonDown="MouseLeftButtonDown_Click" MouseMove="MouseMove_Click" MouseLeftButtonUp="MouseLeftButtonUp_Click" GotFocus="ImageGotFocus" />

        </Canvas>

Панорамирование с помощью кода ядра мыши.

Dim lsPoint = e.GetPosition(CanvasBorder)
Dim res As Point = lsPoint - firstPoint

Dim transform As MatrixTransform = CType(sender, Image).RenderTransform
Dim matrix = transform.Matrix
matrix.TranslatePrepend(res.X, res.Y)

CanvasImage.RenderTransform = New MatrixTransform(matrix)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...