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

на главную

Жанры

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

Напротив, рисунки и геометрические объекты лучше подходят, когда необходимо моделировать сложные и по большей части не интерактивные векторные графические данные с использованием разметки XAML или кода С#. Хотя рисунки и геометрические объекты способны реагировать на события мыши, а также поддерживают проверку попадания и операции перетаскивания, для выполнения таких действий обычно приходится писать больше кода.

Наконец, если требуется самый быстрый способ визуализации значительных объемов графических данных, то должен быть выбран визуальный уровень. Например, предположим, что инфраструктура WPF применяется для построения научного приложения, которое должно отображать тысячи точек на графике данных. За счет использования визуального уровня точки на графике можно

визуализировать оптимальным образом. Как будет показано далее в главе, визуальный уровень доступен только из кода С#, но не из разметки XAML.

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

System.Windows.Shapes
.

На заметку! Инфраструктура WPF поставляется также с полнофункциональным API-интерфейсом, который можно использовать для визуализации и манипулирования трехмерной графикой, но в книге он не рассматривается.

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

Члены пространства имен

System.Windows.Shapes
предлагают наиболее прямолинейный, интерактивный и самый затратный в плане расхода памяти способ визуализации двумерного изображения. Это небольшое пространство имен (расположенное в сборке
PresentationFramework.dll
) состоит всего из шести запечатанных классов, которые расширяют абстрактный базовый класс
Shape
:
Ellipse
,
Rectangle
,
Line
,
Polygon
,
Polyline
и
Path
.

Абстрактный класс

Shape
унаследован от класса
FrameworkElement
, который сам унаследован от
UIElement
. В указанных классах определены члены для работы с изменением размеров, всплывающими подсказками, курсорами мыши и т.п. Благодаря такой цепочке наследования при визуализации графических данных с применением классов, производных от
Shape
, объекты получаются почти такими же функциональными (с точки зрения взаимодействия с пользователем), как элементы управления WPF.

Скажем, для выяснения, щелкнул ли пользователь на визуализированном изображении, достаточно обработать событие

MouseDown
. Например, если написать следующую разметку XAML для объекта
Rectangle
внутри элемента управления
Grid
начального окна
Window
:

<Rectangle x:Name="myRect" Height="30" Width="30" Fill="Green"

MouseDown="myRect_MouseDown"/>

то можно реализовать обработчик события

MouseDown
, который изменяет цвет фона прямоугольника в результате щелчка на нем:

private void myRect_MouseDown(object sender, MouseButtonEventArgs e)

{

// Изменить цвет прямоугольника в результате щелчка на нем.

myRect.Fill = Brushes.Pink;

}

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

выполняется визуализация в неотображаемый буфер и т.д. Члены пространства имен
System.Windows.Shapes
просто реагируют на зарегистрированные вами события подобно типичному элементу управления WPF (
Button
и т.д.).

Недостаток всей готовой функциональности связан с тем, что фигуры потребляют довольно много памяти. Если строится научное приложение, которое рисует тысячи точек на экране, то использование фигур будет неудачным выбором (по существу таким же расточительным в плане памяти, как визуализация тысяч объектов

Button
). Тем не менее, когда нужно сгенерировать интерактивное двумерное векторное изображение, фигуры оказываются прекрасным вариантом.

Помимо функциональности, унаследованной от родительских классов

UIElement
и
FrameworkElement
, в классе
Shape
определено множество собственных членов, наиболее полезные из которых кратко описаны в табл. 26.1.

На заметку! Если вы забудете установить свойства

Fill
и
Stroke
, то WPF предоставит "невидимые" кисти, вследствие чего фигура не будет видна на экране!

Добавление прямоугольников, эллипсов и линий на поверхность Canvas

Вы построите приложение WPF, которое способно визуализировать фигуры, с применением XAML и С#, и попутно исследуете процесс проверки попадания. Создайте новый проект приложения WPF по имени

RenderingWithShapes
и измените заголовок главного окна в
MainWindow.xaml
на
Fun with Shapes!
. Модифицируйте первоначальную разметку XAML для элемента
Window
, заменив
Grid
панелью
DockPanel
, которая содержит (пока пустые) элементы
Toolbar
и
Canvas
. Обратите внимание, что каждому содержащемуся элементу посредством свойства
Name
назначается подходящее имя.

<DockPanel LastChildFill="True">

<ToolBar DockPanel.Dock="Top" Name="mainToolBar" Height="50">

</ToolBar>

<Canvas Background="LightBlue" Name="canvasDrawingArea"/>

</DockPanel>

picture

Заполните элемент

ToolBar
набором объектов
RadioButton
, каждый из которых содержит объект специфического класса, производного от
Shape
. Легко заметить, что каждому элементу
RadioButton
назначается то же самое групповое имя
GroupName
(чтобы обеспечить взаимное исключение) и также подходящее индивидуальное имя.

<ToolBar DockPanel.Dock="Top" Name="mainToolBar" Height="50">

<RadioButton Name="circleOption" GroupName="shapeSelection"

Click="CircleOption_Click">

<Ellipse Fill="Green" Height="35" Width="35" />

</RadioButton>

<RadioButton Name="rectOption" GroupName="shapeSelection"

Click="RectOption_Click">

Поделиться:
Популярные книги

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

Кас Маркус
5. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Маяк надежды

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6