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

12

Я заметил, что при переопределении метода 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 (затем установка элемента в качестве содержимого окна) работает нормально.

Спасибо,

Дэнни

Ваш Ответ

4   ответа
1

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

13

Вот.

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

Error: User Rate Limit Exceeded
3

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

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

enter image description here

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

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

0

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

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

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

Похожие вопросы