Вы построите приложение 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
, позволяющие визуализировать скругленные углы.
Объект Line
представлен своими начальной и конечной точками с использованием свойств X1
, Х2
, Y1
и Y2
(учитывая, что Line
, а также настраивают параметры штриха. На рис. 26.1 показана визуализированная панель инструментов в визуальном конструкторе WPF среды Visual Studio.
С помощью окна Properties (Свойства) среды Visual Studio создайте обработчик события MouseLeftButtonDown
для Canvas
и обработчик события Click
для каждого элемента RadioButton
. Цель заключается в том, чтобы в коде C# визуализировать выбранную фигуру (круг, квадрат или линию), когда пользователь щелкает внутри Canvas
. Первым делом определите следующее вложенное перечисление (и соответствующую переменную-член) внутри класса, производного от Window
:
public partial class MainWindow : Window
{
private enum SelectedShape
{ Circle, Rectangle, Line }
private SelectedShape _currentShape;
}
В каждом обработчике Click
установите переменную-член currentShape
в корректное значение SelectedShape
:
private void CircleOption_Click(object sender, RoutedEventArgs e)
{
_currentShape = SelectedShape.Circle;
}
private void RectOption_Click(object sender, RoutedEventArgs e)
{
_currentShape = SelectedShape.Rectangle;
}
private void LineOption_Click(object sender, RoutedEventArgs e)
{
_currentShape = SelectedShape.Line;
}
Посредством обработчика события MouseLeftButtonDown
элемента Canvas
будет визуализироваться подходящая фигура (предопределенного размера) в начальной точке, которая соответствует позиции (х
, у
) курсора мыши. Ниже приведена полная реализация с последующим анализом:
private void CanvasDrawingArea_MouseLeftButtonDown(object sender,
MouseButtonEventArgs e)
{
Shape shapeToRender = null;
// Сконфигурировать корректную фигуру для рисования.
switch (_currentShape)
{
case SelectedShape.Circle:
shapeToRender = new Ellipse() { Fill = Brushes.Green,
Height = 35, Width = 35 };
break;
case SelectedShape.Rectangle:
shapeToRender = new Rectangle()
{ Fill = Brushes.Red, Height = 35, Width = 35,