Я создаю инструмент для работы с изображениями в 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) вообще не изменяется!
В итоге,
Image
элемент управления в Canvas
элементе управления - Move
Image
внутри Canvas
с помощью мыши - выполняется RenderTransform
- Изменение размера "
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 не меняет местоположениесами ценности.
С чего мне начать?Как я могу заставить его работать?
Заранее спасибо.
Вот дизайн 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)