Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Исправить проблему легко. Вместо того чтобы вручную писать сложную логику отсечения, просто установите свойство
ClipToBoundsCanvastrue<Canvas ClipToBounds = "True" ... >Последняя крошечная модификация, которую понадобится внести, связана с тем фактом, что когда пользователь зеркально отображает холст, щелкая на кнопке переключения, а затем щелкает на нем для рисования новой фигуры, то точка, где был произведен щелчок, не является той позицией, куда попадут графические данные. Взамен они появятся в месте нахождения курсора мыши.
Чтобы устранить проблему, примените тот же самый объект трансформации к рисуемой фигуре перед выполнением визуализации (через
RenderTransformprivate void CanvasDrawingArea_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){ // Для краткости код не показан. if (flipCanvas.IsChecked == true) { RotateTransform rotate = new RotateTransform(-180); shapeToRender.RenderTransform = rotate; } // Установить левую верхнюю точку для рисования на холсте. Canvas.SetLeft(shapeToRender, e.GetPosition(canvasDrawingArea).X); Canvas.SetTop(shapeToRender, e.GetPosition(canvasDrawingArea).Y); // Нарисовать фигуру. canvasDrawingArea.Children.Add(shapeToRender);}На этом исследование пространства имен
System.Windows.ShapesРабота с редактором трансформаций Visual Studio
В предыдущем примере разнообразные трансформации применялись за счет ручного ввода разметки и написания кода С#. Наряду с тем, что поступать так вполне удобно, последняя версия Visual Studio поставляется со встроенным редактором трансформаций. Вспомните, что получателем служб трансформаций может быть любой элемент пользовательского интерфейса, в том числе диспетчер компоновки, содержащий различные элементы управления. Для демонстрации работы с редактором трансформаций Visual Studio будет создан новый проект приложения WPF по имени
FunWithTransformsПостроение начальной компоновки
Первым делом разделите первоначальный элемент
GridStackPanelGridStackPanelButton<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <StackPanel Grid.Row="0" Grid.Column="0"> <Button Name="btnSkew" Content="Skew" Click="Skew"/> <Button Name="btnRotate" Content="Rotate" Click="Rotate"/> <Button Name="btnFlip" Content="Flip" Click="Flip"/> </StackPanel></Grid>Добавьте обработчики событий для кнопок:
private void Skew(object sender, RoutedEventArgs e){}private void Rotate(object sender, RoutedEventArgs e){}private void Flip(object sender, RoutedEventArgs e){}Чтобы завершить пользовательский интерфейс, создайте во второй колонке элемента
Grid<Canvas x:Name="myCanvas" Grid.Column="1" Grid.Row="0"> <Ellipse HorizontalAlignment="Left" VerticalAlignment="Top" Height="186" Width="92" Stroke="Black" Canvas.Left="20" Canvas.Top="31"> <Ellipse.Fill> <RadialGradientBrush> <GradientStop Color="#FF951ED8" Offset="0.215"/> <GradientStop Color="#FF2FECB0" Offset="1"/> </RadialGradientBrush>