Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

<DockPanel LastChildFill="True">

<DockPanel.LayoutTransform>

<RotateTransform Angle="45"/>

</DockPanel.LayoutTransform>

...

</DockPanel>

В рассматриваемом примере это несколько чрезмерно, так что добавьте последнюю (менее радикальную) возможность, которая позволит пользователю зеркально отобразить целый контейнер

Canvas
и всю содержащуюся в нем графику. Начните с добавления в
ToolBar
финального элемента
ToggleButton
со следующим определением:

<ToggleButton Name="flipCanvas" Click="FlipCanvas_Click"

Content="Flip Canvas!"/>

Внутри обработчика события

Click
для нового элемента
ToggleButton
создайте объект
RotateTransform
и подключите его к объекту
Canvas
через свойство
LayoutTransform
, если элемент
ToggleButton
отмечен. Если же элемент
ToggleButton
не отмечен, тогда удалите трансформацию, установив свойство
LayoutTransform
в
null
.

private void FlipCanvas_Click(object sender, RoutedEventArgs e)

{

if (flipCanvas.IsChecked == true)

{

RotateTransform rotate = new RotateTransform(-180);

canvasDrawingArea.LayoutTransform = rotate;

}

else

{

canvasDrawingArea.LayoutTransform = null;

}

}

Запустите приложение и добавьте несколько графических фигур в область

Canvas
, следя за тем, чтобы они находились впритык к ее краям. После щелчка на новой кнопке обнаружится, что фигуры выходят за границы
Canvas
(рис. 26.9). Причина в том, что не был определен прямоугольник отсечения.

Исправить проблему легко. Вместо того чтобы вручную писать сложную логику отсечения, просто установите свойство

ClipToBounds
элемента
Canvas
в
true
, предотвратив визуализацию дочерних элементов вне границ родительского элемента. После запуска приложения можно заметить, что графические данные больше не покидают границы отведенной области.

<Canvas ClipToBounds = "True" ... >

Последняя крошечная модификация, которую понадобится внести, связана с тем фактом, что когда пользователь зеркально отображает холст, щелкая на кнопке переключения, а затем щелкает на нем для рисования новой фигуры, то точка, где был произведен щелчок, не является той позицией, куда попадут графические данные. Взамен они появятся в месте нахождения курсора мыши.

Чтобы устранить проблему, примените тот же самый объект трансформации к рисуемой фигуре перед выполнением визуализации (через

RenderTransform
). Ниже показан основной фрагмент кода:

private 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
, кистей и трансформаций завершено. Прежде чем перейти к анализу роли визуализации графики с использованием рисунков и геометрических объектов, имеет смысл выяснить, каким образом IDE-среда Visual Studio способна упростить работу с примитивными графическими элементами.

Работа с редактором трансформаций 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)

Поделиться с друзьями: