Масштабирование wpf с помощью ScaleTransofrm не работает нормально
При попытке увеличить Scale(X/Y) на любую величину контент просто пропадает, а при рисовании вообще творится чертовщина какая то. Пробовал во все контейнеры компоновки вставлять этот Transform - такая же фигня, просто контент(всякие кнопки, элементы, нарисованные вещи) пропадает навечно. Но при этом если статично в xaml разметке все ставить, то работает. Xaml:
<Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<RadioButton Content="Линия"
Margin="4"
x:Name="radioButtonLine"
IsChecked="True" />
<RadioButton Content="Эллипс"
Margin="4"
x:Name="radioButtonEllipse" />
<RadioButton Content="Квадарат"
Margin="4"
x:Name="radioButtonRectangle"/>
<Button Content="Next" Command="{Binding Select}"></Button>
</StackPanel>
<Canvas Grid.Column="1"
Background="Black"
MouseLeftButtonDown="Canvas_MouseLeftButtonDown"
MouseMove="Canvas_MouseMove"
MouseLeftButtonUp="canvas_MouseLeftButtonUp"
Name="canvas"
MouseWheel="Canvas_Transform">
<Canvas.RenderTransform>
<ScaleTransform x:Name="scale"/>
</Canvas.RenderTransform>
</Canvas>
</Grid>
</Grid>
С#:
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
arg = e;
point = e.GetPosition(canvas);
if (radioButtonLine.IsChecked == true)
{
line = new Line();
line.Stroke = Brushes.White;
line.X1 = line.X2 = point.X;
line.Y1 = line.Y2 = point.Y;
canvas.Children.Add(line);
}
if (radioButtonEllipse.IsChecked == true)
{
ellipse = new Ellipse();
ellipse.Stroke = Brushes.White;
ellipse.SetValue(Canvas.TopProperty, point.Y);
ellipse.SetValue(Canvas.LeftProperty, point.X);
canvas.Children.Add(ellipse);
}
if (radioButtonRectangle.IsChecked == true)
{
rect = new Rectangle();
rect.Stroke = Brushes.White;
rect.SetValue(Canvas.LeftProperty, point.X);
rect.SetValue(Canvas.TopProperty, point.Y);
canvas.Children.Add(rect);
}
IsDrawing = true;
}
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if (IsDrawing)
{
App.paintViewModel.SavedContent = Content;
Point pointEnd = e.GetPosition(canvas);
if (radioButtonLine.IsChecked == true)
{
line.X2 = pointEnd.X;
line.Y2 = pointEnd.Y;
IsDrawing = false;
Canvas_MouseLeftButtonDown(sender, arg);
}
if (radioButtonEllipse.IsChecked == true)
{
if (point.X > pointEnd.X)
ellipse.SetValue(Canvas.LeftProperty, pointEnd.X);
else
ellipse.SetValue(Canvas.LeftProperty, point.X);
if (point.Y > pointEnd.Y)
ellipse.SetValue(Canvas.TopProperty, pointEnd.Y);
else
ellipse.SetValue(Canvas.TopProperty, point.Y);
ellipse.Width = Math.Abs(pointEnd.X - point.X);
ellipse.Height = Math.Abs(point.Y - pointEnd.Y);
}
if (radioButtonRectangle.IsChecked == true)
{
if (point.X > pointEnd.X)
rect.SetValue(Canvas.LeftProperty, pointEnd.X);
else
rect.SetValue(Canvas.LeftProperty, point.X);
if (point.Y > pointEnd.Y)
rect.SetValue(Canvas.TopProperty, pointEnd.Y);
else
rect.SetValue(Canvas.TopProperty, point.Y);
rect.Width = Math.Abs(pointEnd.X - point.X);
rect.Height = Math.Abs(point.Y - pointEnd.Y);
}
}
}
private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
IsDrawing = false;
}
private void Canvas_Transform(object sender, MouseWheelEventArgs e)
{
Point center = e.GetPosition(this);
this.scale.CenterX = center.X;
this.scale.ScaleY = center.Y;
if (e.Delta < 0)
{
this.scale.ScaleX -= 0.001;
this.scale.ScaleY -= 0.001;
}
else
{
this.scale.ScaleX += 0.001;
this.scale.ScaleY += 0.001;
}
}

