Ответ 1
Ответ дан Chales Petzold здесь.
Его ответ - "не знаю почему", однако комментарий правильно предполагает, что установка фона фона для прозрачного исправляет ошибку.
Я заметил, что при переопределении метода 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 (затем установка элемента как содержимого окна) работает нормально.
спасибо,
Дэнни
Ответ дан Chales Petzold здесь.
Его ответ - "не знаю почему", однако комментарий правильно предполагает, что установка фона фона для прозрачного исправляет ошибку.
На самом деле Окно красит себя, что, среди прочего, является прямоугольником для фона. Все, что добавлено в OnRender, находится за фоном. Сделайте фон прозрачным, и вы увидите, что находится за ним.
По крайней мере, это то, что я узнал при использовании Button и OnRender. Если я рисую только внутри кнопки, ничего не видно, потому что над ней нарисована кнопка. Но если рисунок выходит за границы кнопок, можно увидеть что-либо снаружи.
Здесь пустая кнопка нарисована на желтом фоне. В OnRender я рисую две черные линии, образующие крест. Но видны только части линии за пределами кнопки.
Очень странное поведение OnRender, действительно!
Я думаю, что Grid создает эту проблему. По умолчанию Window содержит элемент Grid
как проверка, выполняет ли сниппет с удаляемыми линиями dc.Draw...
(т.е. является ли это действием переопределения или дополнительными командами рисования, которые вызывают проблему)?
Я нашел ссылку, которая предполагает, что просто переупорядочение вызовов может решить проблему (т.е. делать вызовы dc.Draw...
перед вызовом base.OnRender(dc)
).
http://www.codeproject.com/Messages/3356653/Override-OnRender-class-inherits-frameworkelement.aspx