Абстрактный класс 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 предоставит "невидимые" кисти, вследствие чего фигура не будет видна на экране!
Добавление прямоугольников, эллипсов и линий на поверхность Canvas
Вы построите приложение 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
, позволяющие визуализировать скругленные углы.
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT