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

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

Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

1 ... 338 339 340 341 342 343 344 345 346 ... 407
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
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>

    </Ellipse.Fill>

  </Ellipse>

  <Ellipse HorizontalAlignment="Left" VerticalAlignment="Top"

       Height="101" Width="110" Stroke="Black"

       Canvas.Left="122" Canvas.Top="126">

    <Ellipse.Fill>

      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">

        <GradientStop Color="#FFB91DDC" Offset="0.355"/>

        <GradientStop Color="#FFB0381D" Offset="1"/>

      </LinearGradientBrush>

    </Ellipse.Fill>

  </Ellipse>

</Canvas>

Окончательная компоновка показана на рис. 26.10.

Применение трансформаций на этапе проектирования

Как упоминалось ранее, IDE-среда Visual Studio предоставляет встроенный редактор трансформаций, который можно найти в окне Properties. Раскройте раздел Transform (Трансформация), чтобы отобразить области RenderTransform и LayoutTransform редактора (рис. 26.11).

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

Испытайте каждую из описанных трансформаций,используя в качестве цели специальную фигуру (для отмены выполненной операции просто нажимайте <Ctrl+Z>). Как и многие другие аспекты раздела Transform окна Properties, каждая трансформация имеет уникальный набор параметров конфигурации, которые должны стать вполне понятными, как только вы просмотрите их. Например, редактор трансформации Skew позволяет устанавливать значения скоса х и у, а редактор трансформации Flip дает возможность зеркально отображать относительно оси х или у и т.д.

Трансформация холста в коде

Реализации обработчиков для всех кнопок будут более или менее похожими. Мы сконфигурируем объект трансформации и присвоим его объекту myCanvas. Затем после запуска приложения можно будет щелкать на кнопке, чтобы просматривать результат применения трансформации. Ниже приведен полный код обработчиков (обратите внимание на установку свойства LayoutTransform, что позволяет фигурам позиционироваться относительно родительского контейнера):

private void Flip(object sender, System.Windows.RoutedEventArgs e)

{

  myCanvas.LayoutTransform = new ScaleTransform(-1, 1);

}

private void Rotate(object sender, System.Windows.RoutedEventArgs e)

{

  myCanvas.LayoutTransform = new RotateTransform(180);

}

private void Skew(object sender, System.Windows.RoutedEventArgs e)

{

  myCanvas.LayoutTransform = new SkewTransform(40, -20);

}

Визуализация графических данных с использованием рисунков и геометрических объектов

Несмотря на то что типы Shape позволяют генерировать интерактивную двумерную поверхность любого вида, из-за насыщенной цепочки наследования они потребляют довольно много памяти. И хотя класс Path может помочь снизить накладные расходы за счет применения включенных геометрических объектов (вместо крупной коллекции других фигур), инфраструктура WPF предоставляет развитый API-интерфейс рисования и геометрии, который визуализирует еще более легковесные двумерные векторные изображения.

Входной точкой в этот API-интерфейс является абстрактный класс System.Windows.Media.Drawing (из сборки PresentationCore.dll), который сам по себе всего лишь определяет ограничивающий прямоугольник для хранения результатов визуализации.

Инфраструктура WPF предлагает разнообразные классы, расширяющие Drawing, каждый из которых представляет отдельный способ рисования содержимого (табл. 26.7).

Будучи более легковесными, производные от Drawing типы не обладают встроенной возможностью обработки событий, т.к. они не являются UIElement или FrameworkElement (хотя допускают программную реализацию логики проверки попадания).

Другое ключевое отличие между типами, производными от Drawing, и типами, производными от Shape, состоит в том, что производные от Drawing типы не умеют визуализировать себя, поскольку не унаследованы от UIElement! Для отображения содержимого производные типы должны помещаться в какой-то контейнерный объект (в частности DrawingImage, DrawingBrush или DrawingVisual).

Класс DrawingImage позволяет помещать рисунки и геометрические объекты внутрь элемента управления Image из WPF, который обычно применяется для отображения данных из внешнего файла. Класс DrawingBrush дает возможность строить кисть на основе рисунков и геометрических объектов, которая предназначена для установки свойства, требующего кисть. Наконец, класс DrawingVisual используется только на "визуальном" уровне графической визуализации, полностью управляемом из кода С#.

Хотя работать с рисунками немного сложнее,

1 ... 338 339 340 341 342 343 344 345 346 ... 407
Перейти на страницу:
Отзывы - 0

Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


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

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.


Партнер

Новые отзывы

  1. Гость Татьяна Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
  2. Римма Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
  3. Римма Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова
Все комметарии
Новое в блоге