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

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

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

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 предоставит "невидимые" кисти, вследствие чего фигура не будет видна на экране!

<p id="AutBody_Root1176"><strong>Добавление прямоугольников, эллипсов и линий на поверхность Canvas</strong></p>

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

 

 

 

picture

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

 

               Click="CircleOption_Click">

   

 

 

               Click="RectOption_Click">

   

 

 

               Click="LineOption_Click">

   

      X1="10" Y1="10" Y2="25" X2="25"

      StrokeStartLineCap="Triangle" StrokeEndLineCap="Round" />

 

Как видите, объявление объектов Rectangle, Ellipse и Line в разметке XAML довольно прямолинейно и требует лишь минимальных комментариев. Вспомните, что свойство Fill позволяет указать кисть для рисования внутренностей фигуры. Когда нужна кисть сплошного цвета, можно просто задать жестко закодированную строку известных значений, а соответствующий преобразователь типа сгенерирует корректный объект. Интересная характеристика типа Rectangle связана с тем, что в нем определены свойства RadiusX и RadiusY, позволяющие визуализировать скругленные углы.

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

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

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT