Я знаю, что спрашивали раньше.Но я не могу заставить помеченное решение работать.
Я использую шаблон Wpf и MVVM.Что я думал, что привязка будет работать.Но это не так.
Программа, которой я сейчас занимаюсь, рисует серый прямоугольник на изображении.Все чертежи на месте.За исключением случаев, когда прямоугольник повернут.
Это структура моего элемента управления.
<ItemsControl ItemsSource="{Binding RectItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas x:Name="canvas" Background="Transparent" Height="{Binding ElementName=img, Path=ActualHeight}" Width="{Binding ElementName=img, Path=ActualWidth}"
>
<Canvas.LayoutTransform>
<TransformGroup>
<ScaleTransform ScaleX="{Binding zoomValue}" ScaleY="{Binding zoomValue}"/>
</TransformGroup>
</Canvas.LayoutTransform>
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="{Binding Width}"
Height="{Binding Height}"
Fill="Transparent"
Stroke="Blue"
StrokeThickness="1" RenderTransformOrigin=".5,.5" >
<Rectangle.LayoutTransform>
<RotateTransform Angle="{Binding Rotation}"/>
</Rectangle.LayoutTransform>
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Это пример нарисованного изображения
Повернутый прямоугольник - это нарисованный прямоугольник
Но я не могу получить обновленные координаты при его повороте.
Я даже попытался прочитать координаты дочерних элементов canvas.
Как показано ниже:
class CanvasMouseRightButtonDown : Behavior<Canvas>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.MouseRightButtonDown += AssociatedObject_MouseRightButtonDown;
}
private void AssociatedObject_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
foreach (var item in AssociatedObject.Children)
{
double X = Canvas.GetLeft((UIElement)item);
Debug.WriteLine("x: " + X);
}
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.MouseRightButtonDown -= AssociatedObject_MouseRightButtonDown;
}
}
Я даже использую этот класс
class Maths
{
public static Point UpdatePoint(Point p, Point origin, double radian)
{
double dx = p.X - origin.X;
double dy = p.Y - origin.Y;
return new Point(
(dx * Math.Cos(radian) - dy * Math.Sin(radian)) + origin.X,
(dx * Math.Sin(radian) + dy * Math.Cos(radian)) + origin.Y
);
}
public static double Min(params double[] values)
{
if (values.Length == 0) return 0;
if (values.Length == 1) return values[0];
double val = values[0];
for (int i = 1; i < values.Length; i++)
{
val = (values[i] < val) ? values[i] : val;
}
return val;
}
public static double Max(params double[] values)
{
if (values.Length == 0) return 0;
if (values.Length == 1) return values[0];
double val = values[0];
for (int i = 1; i < values.Length; i++)
{
val = (values[i] > val) ? values[i] : val;
}
return val;
}
public static Rect GetBounds(Point p1, Point p2, Point p3, Point p4)
{
double l = Min(p1.X, p2.X, p3.X, p4.X);
double t = Min(p1.Y, p2.Y, p3.Y, p4.Y);
double r = Max(p1.X, p2.X, p3.X, p4.X);
double b = Max(p1.Y, p2.Y, p3.Y, p4.Y);
return new Rect(l, t, r - l, b - t);
}
public static Rect GetBounds(double width, double height, double angle)
{
double centerX = width / 2;
double centerY = height / 2;
var center = new Point(centerX, centerY);
var p1 = new Point(0, 0);
var p2 = new Point(centerX * 2, 0);
var p3 = new Point(centerX * 2, centerY * 2);
var p4 = new Point(0, centerY * 2);
double radian = angle * Math.PI / 180;
p1 = Maths.UpdatePoint(p1, center, radian);
p2 = Maths.UpdatePoint(p2, center, radian);
p3 = Maths.UpdatePoint(p3, center, radian);
p4 = Maths.UpdatePoint(p4, center, radian);
return GetBounds(p1, p2, p3, p4);
}
}
И вот как я использую класс выше
Maths.GetBounds(r.Width, r.Height, r.rotation)
Затем я передаю результат getbounds в
ImageMagick.MagickImage
Но нарисованный прямоугольник не в правильном положении, только для повернутого прямоугольника.
С уважением, Рамон