KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Перейти на страницу:
Язык программирования C#9 и платформа .NET5 - _235.png

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

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)

{

}

Чтобы завершить пользовательский интерфейс, создайте во второй колонке элемента

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>

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*