Подтвердить что ты не робот

Почему переопределение метода WPF Window.OnRender не отображается на экране?

Я заметил, что при переопределении метода System.Windows.Window OnRender не получается рисовать на экране. Я уверен, что есть веская причина для этого, но не смог найти объяснения.

Следующий код демонстрирует это:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        Pen pen = new Pen();

        public Window1()
        {
            InitializeComponent();
            pen.Brush = Brushes.Black;
        }

        protected override void OnRender(DrawingContext dc)
        {
            base.OnRender(dc);
            dc.DrawRectangle(Brushes.Black, pen, new Rect(0, 0, 600, 400));
            dc.DrawEllipse(Brushes.Green, pen, new Point(300, 300), 50, 50);
        }
    }
}

замена логики рисования в элементе FrameworkElement (затем установка элемента как содержимого окна) работает нормально.

спасибо,

Дэнни

4b9b3361

Ответ 1

Ответ дан Chales Petzold здесь.

Его ответ - "не знаю почему", однако комментарий правильно предполагает, что установка фона фона для прозрачного исправляет ошибку.

Ответ 2

На самом деле Окно красит себя, что, среди прочего, является прямоугольником для фона. Все, что добавлено в OnRender, находится за фоном. Сделайте фон прозрачным, и вы увидите, что находится за ним.

По крайней мере, это то, что я узнал при использовании Button и OnRender. Если я рисую только внутри кнопки, ничего не видно, потому что над ней нарисована кнопка. Но если рисунок выходит за границы кнопок, можно увидеть что-либо снаружи.

enter image description here

Здесь пустая кнопка нарисована на желтом фоне. В OnRender я рисую две черные линии, образующие крест. Но видны только части линии за пределами кнопки.

Очень странное поведение OnRender, действительно!

Ответ 3

Я думаю, что Grid создает эту проблему. По умолчанию Window содержит элемент Grid

Ответ 4

как проверка, выполняет ли сниппет с удаляемыми линиями dc.Draw... (т.е. является ли это действием переопределения или дополнительными командами рисования, которые вызывают проблему)?

Я нашел ссылку, которая предполагает, что просто переупорядочение вызовов может решить проблему (т.е. делать вызовы dc.Draw... перед вызовом base.OnRender(dc)).

http://www.codeproject.com/Messages/3356653/Override-OnRender-class-inherits-frameworkelement.aspx