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

В коде проверяется переменная-член _currentShape с целью создания корректного объекта, производного от Shape. Затем устанавливаются координаты левого верхнего угла внутри Canvas с использованием входного объекта MouseButtonEventArgs. Наконец, в коллекцию объектов UIElement, поддерживаемую Canvas, добавляется новый производный от Shape объект. Если запустить программу прямо сейчас, то она должна позволить щелкать левой кнопкой мыши где угодно на холсте и визуализировать в позиции щелчка выбранную фигуру.

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

Имея в распоряжении элемент Canvas с коллекцией объектов, может возникнуть вопрос: как динамически удалить элемент, скажем, в ответ на щелчок пользователя правой кнопкой мыши на фигуре? Это делается с помощью класса VisualTreeHelper из пространства имен System.Windows.Media. Роль "визуальных деревьев" и "логических деревьев" более подробно объясняется в главе 27, а пока организуйте обработку события MouseRightButtonDown объекта Canvas и реализуйте соответствующий обработчик:

private void CanvasDrawingArea_MouseRightButtonDown(object sender,

                                                    MouseButtonEventArgs e)

{

  // Сначала получить координаты x,y позиции,

  // где пользователь выполнил щелчок.

  Point pt = e.GetPosition((Canvas)sender);

  // Использовать метод HitTestO класса VisualTreeHelper, чтобы

  // выяснить, щелкнул ли пользователь на элементе внутри Canvas.

  HitTestResult result = VisualTreeHelper.HitTest(canvasDrawingArea, pt);

  // Если переменная result не равна null, то щелчок произведен на фигуре.

  if (result != null)

  {

      // Получить фигуру, на которой совершен щелчок, и удалить ее из Canvas.

      canvasDrawingArea.Children.Remove(result.VisualHit as Shape);

  }

}

Метод начинается с получения точных координат (х, у) позиции, где пользователь щелкнул внутри Canvas, и проверки попадания посредством статического метода VisualTreeHelper.HitTest. Возвращаемое значение — объект HitTestResult — будет установлено в null, если пользователь выполнил щелчок не на UIElement внутри Canvas. Если значение HitTestResult не равно null, тогда с помощью свойства VisualHit можно получить объект UIElement, на котором был совершен щелчок, и привести его к типу, производному от Shape (вспомните, что Canvas может содержать любой UIElement, а не только фигуры). Детали, связанные с "визуальным деревом", будут изложены в главе 27.

На заметку! По умолчанию метод VisualTreeHelper.HitTest возвращает объект UIElement самого верхнего уровня, на котором совершен щелчок, и не предоставляет информацию о других объектах, расположенных под ним (т.е. перекрытых в Z-порядке).

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

До настоящего момента вы применяли объекты типов, производных от Shape, для визуализации содержимого элементов RadioButton с использованием разметки XAML и заполняли Canvas в коде С#. Во время исследования роли кистей и графических трансформаций в данный пример будет добавлена дополнительная функциональность. К слову, в другом примере главы будут иллюстрироваться приемы перетаскивания на объектах UIElement. А пока давайте рассмотрим оставшиеся члены пространства имен System.Windows.Shapes.

<p id="AutBody_Root1178"><strong>Работа с элементами Polyline и Polygon</strong></p>

В текущем примере используются только три класса, производных от Shape. Остальные дочерние классы (Polyline, Polygon и Path) чрезвычайно трудно корректно визуализировать без инструментальной поддержки (такой как инструмент Blend для Visual Studio или другие инструменты, которые могут создавать векторную графику) — просто потому, что они требуют определения большого количества точек для своего выходного представления. Ниже представлен краткий обзор остальных типов Shapes.

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

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

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

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

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

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

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

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

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