Язык программирования C#9 и платформа .NET5
Исправить проблему легко. Вместо того чтобы вручную писать сложную логику отсечения, просто установите свойство
элементаClipToBoundsвCanvas, предотвратив визуализацию дочерних элементов вне границ родительского элемента. После запуска приложения можно заметить, что графические данные больше не покидают границы отведенной области.true<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);}На этом исследование пространства имен
, кистей и трансформаций завершено. Прежде чем перейти к анализу роли визуализации графики с использованием рисунков и геометрических объектов, имеет смысл выяснить, каким образом IDE-среда Visual Studio способна упростить работу с примитивными графическими элементами.System.Windows.ShapesРабота с редактором трансформаций Visual Studio
В предыдущем примере разнообразные трансформации применялись за счет ручного ввода разметки и написания кода С#. Наряду с тем, что поступать так вполне удобно, последняя версия Visual Studio поставляется со встроенным редактором трансформаций. Вспомните, что получателем служб трансформаций может быть любой элемент пользовательского интерфейса, в том числе диспетчер компоновки, содержащий различные элементы управления. Для демонстрации работы с редактором трансформаций Visual Studio будет создан новый проект приложения WPF по имени
.FunWithTransformsПостроение начальной компоновки
Первым делом разделите первоначальный элемент
на две колонки с применением встроенного редактора сетки (точные размеры колонок роли не играют). Далее отыщите в панели инструментов элемент управленияGridи добавьте его так, чтобы он занял все пространство первой колонкиStackPanel; затем добавьте в панельGridтри элемента управленияStackPanel:Button<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>
