Выделение эллипса в программе WPF с использованием C#

В этом примере показано, как вы можете визуализировать эллипс в программе WPF. Обычно для рисования фигур в WPF вы используете какой-то объект. Вы можете добавить Ellipse, Line, Path, Polygon, Polyline и Rectangle к окну, и эти формы перерисовывают, когда это необходимо.

Однако иногда вы можете рисовать окно во время выполнения без создания таких объектов. Программы WPF не предоставляют событие Paint, как это делают приложения Windows Forms, поэтому вы не помещаете свой код. Вместо этого вы должны переопределить метод OnRender окна (или другого элемента управления). Этот метод предоставляет параметр DrawingContext с именем drawingContext, который можно использовать для рисования (так же, как обработчик событий Paint) предоставляет Graphics tt>, который можно использовать для рисования). Рисование внутри метода OnRender достаточно прост, хотя есть несколько уловов.

Во-первых, если вы рисуете окно, вам нужно установить свойство Background окна в Transparent. Если вы этого не сделаете, то окно, похоже, нарисовало его фон после вызова метода OnRender, чтобы все, что вы нарисовали, не появилось.

Во-вторых, мне еще предстоит найти хороший способ определить размер клиентской области окна - его область без границ, заголовок, меню и т. д. К счастью, достаточно легко обойти. Просто получите размер основного объекта содержимого окна, который по умолчанию является элементом управления Grid. Чтобы сделать это проще, в этом примере я устанавливаю основное свойство Grid элемента управления Name в grdMain. Затем код может просто использовать grdMain.ActualWidth и grdMain.ActualHeight, чтобы получить размеры клиентской области.

Следующий код показывает, как программа рисует эллипс всякий раз, когда форма отображается.

protected override void OnRender(DrawingContext drawingContext)
{
    // Очистите фон.
    Rect bg_rect = new Rect(0, 0,
        this.ActualWidth, this.ActualHeight);
    drawingContext.DrawRectangle(Brushes.White, null, bg_rect);

    // Сделайте ручку для выделения эллипса.
    const double pen_width = 5;
    Pen pen = new Pen(Brushes.Blue, pen_width);

    // Получите центр содержимого Grid control.
    double center_x = grdMain.ActualWidth / 2;
    double center_y = grdMain.ActualHeight / 2;
    Point center = new Point(center_x, center_y);

    // Вычитаем половину ширины пера из
    // центр, чтобы получить radius_x и radius_y
    // поэтому эллипс просто касается сторон формы.
    double radius_x = center_x - pen_width / 2;
    double radius_y = center_y - pen_width / 2;

    // Рисуем эллипс.
    drawingContext.DrawEllipse(Brushes.LightBlue,
        pen, center, radius_x, radius_y);
}

Сначала код рисует белый прямоугольник в окне, чтобы очистить его фон. Затем он создает синюю ручку. Обратите внимание, что в WPF вы передаете конструктор Pen a Brush не просто цвет. Это связано с тем, что WPF заполняет строки, а не просто рисует их. Это кажется странным, если вы используете линии с одним пикселем для рисования фигур, но чертежи WPF масштабируемы. Если вы увеличиваете масштаб рисунка, линии становятся толще, а затем вы можете увидеть затенение или узор в кисти линии. (Это по-прежнему кажется мне немного странным. Многие программы рисуют сплошные линии. Странно, что WPF предоставляет стандартные сплошные кисти, но не стандартные сплошные линии.)

Обратите внимание, что класс Pen WPF не имеет метода Dispose, поэтому вы не можете размещать ручки или создавать их в с помощью операторов. р>

После создания своего пера программа вычисляет центр клиентской области. Он вычитает половину ширины / высоты пера из ширины / высоты клиентской области, чтобы эллипс просто касался краев окна. Программа заканчивается с помощью метода DrawingContext объекта DrawEllipse для рисования эллипса.

Источник: http://csharphelper.com/blog/2015/04/render-an-ellipse-in-a-wpf-program-using-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector