Почему переопределение метода WPF Window.OnRender не отображается на экране? - PullRequest
12 голосов
/ 30 июня 2009

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

спасибо,

Danny

Ответы [ 4 ]

14 голосов
/ 28 июля 2010

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

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

3 голосов
/ 11 января 2014

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

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

enter image description here

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

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

1 голос
/ 06 марта 2011

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

0 голосов
/ 25 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...