Я делаю приложение для нанесения рисунка. Потому что я хочу такое же поведение, как математические участки я применяю после трансформации в холст с точками данных:Как применить визуализацию Преобразование в положение мыши
<UserControl.Resources>
<TransformGroup x:Key="CanvasTransform">
<TranslateTransform X="30" Y="30"/>
<ScaleTransform ScaleX="1" ScaleY="-1" CenterX=".5" CenterY=".5" />
</TransformGroup>
</UserControl.Resources>
Вот преобразование используется:
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas>
<Canvas.RenderTransformOrigin>
<Point X="0.5" Y="0.5"/>
</Canvas.RenderTransformOrigin>
<Canvas.RenderTransform>
<Binding Source="{StaticResource CanvasTransform}"/>
</Canvas.RenderTransform>
</Canvas>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
До сих пор так хорошо. Проблема заключается в добавлении точек в график. Поскольку событие щелчка мыши возвращает позицию в координатах окна, это бесполезно. Точка добавляется в неправильном месте, потому что она преобразуется после добавления.
например. Холст высотой 400 единиц. Я нажимаю в левом верхнем углу мыши. [X=10, Y=10]
эта точка добавляется к сюжету и визуализируется. Затем преобразование рендеринга использует точку [10,10] и вычисляет новое положение: [X=40,Y=360]
(координаты окна).
Это означает, что я нажимаю в верхнем углу, и точка появляется в нижнем углу. Это на самом деле правильное поведение.
Мой вопрос заключается в том, как применить визуализацию вручную перед сохранением точки, поэтому точка появится под мышью.
До сих пор я попытался следующее:
var trans = Resources["CanvasTransform"] as TransformGroup;
var mouse = e.GetPosition(this); // mouse position relative to canvas
var newPoint = trans.Transform(mouse);
Но после этого преобразования newPoint
имеет следующие координаты [40,-39]
. Опять я знаю, почему результат такой, какой он есть. Происхождение преобразования - [0,0]
, а перевод - 29
, вероятно, из-за ошибки округления.
Теперь я могу взять эту новую точку и вручную изменить значения - вычесть 30
из координаты X, а затем добавить Canvas.ActualHeight
в координату Y, которая зафиксирует положение.
Но тогда в чем смысл?
Мой вопрос: можно ли использовать RenderTransform
так же, как это делает rendere, чтобы избежать возиться с координатами?
Спасибо, что сделал трюк. – jnovacho