为什么覆盖WPF Window.OnRender方法无法绘制到屏幕?

Dan*_*her 12 wpf

我注意到,当覆盖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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

替换FrameworkElement中的绘图逻辑(然后将元素设置为窗口的内容)工作正常.

谢谢,

丹尼

Dan*_*her 15

答案由Chales Petzold 在这里给出.

他的回答是"不知道为什么",但是评论正确地表明将窗口的背景设置为透明可以修复错误.


Pet*_*ber 5

实际上,Window 会绘制自己,其中包括一个矩形作为背景。在 OnRender 中添加的任何内容都在后台。使背景透明,人们可以看到它背后的东西。

至少这是我在使用 Button 和 OnRender 时发现的。如果我只在按钮内绘制,则什么也看不到,因为按钮是在它上面绘制的。但是如果绘图超出按钮边界,则可以看到外面的任何东西。

在此处输入图片说明

这里在黄色背景上绘制了一个空按钮。在 OnRender 中,我画了 2 条黑线形成一个十字。但只能看到按钮外的线条部分。

OnRender 非常奇怪的行为,确实!