2

好吧,我难住了。为什么这不渲染正方形?(注意,我故意使用正负坐标,因此无论原点如何,它都会显示。不知道 x/y 是否反转等)

public partial class Main : Window
{
    StreamGeometry _cueGeometry;
    Brush          _cueBrush;
    Pen            _cuePen;

    public Main()
    {
        InitializeComponent();

        _cueGeometry = new StreamGeometry();
        using (var geometryContext = _cueGeometry.Open())
        {
            geometryContext.BeginFigure(new Point( 40, 40), true, true);
            geometryContext.LineTo     (new Point( 40,-40), true, true);
            geometryContext.LineTo     (new Point(-40,-40), true, true);
            geometryContext.LineTo     (new Point(-40, 40), true, true);
        }
        _cueGeometry.Freeze();

        _cueBrush = Brushes.AliceBlue;

        _cuePen = new Pen(Brushes.Gray, 1);
        _cuePen.Freeze();

    }

    protected override void OnRender(DrawingContext dc)
    {
        base.OnRender(dc);
        dc.DrawGeometry(_cueBrush, _cuePen, _cueGeometry);
    }

}

更新

我注意到还有一些奇怪的事情。如果我将此代码移动到具有红色背景的 Panel 的子类中,它会呈现红色背景,然后呈现一个前面带有灰色边框的蓝色方块。(注意:它没有被剪裁到控件的边界,这就是我可以看到所有那个正方形的方式。)

但是,如果我只是将子类更改为 UserControl,则带有灰色边框的蓝色方块将呈现在红色控件的后面。(同样,我可以看到这一点,因为我禁用了剪辑。)

如果最终将其更改为 Control 的子类,我将不再获得红色背景,而只会获得带有灰色边框的蓝色方块。我认为这是因为 Control 自己不进行任何渲染,但仍然没有解释为什么背景颜色在 UserControl 而不是 Panel 中渲染在我的绘图上。我的猜测是模板中的某些元素出现在渲染的前面,但我想不出那会是什么。

4

2 回答 2

1

找到了。窗口的默认模板在内容区域中有一个边框,该边框具有不透明的白色背景,阻碍了渲染。使用 Snoop,我找到了边界,将可见性更改为“隐藏”,果然,有渲染路径。

谜团已揭开!

于 2012-12-21T00:28:31.063 回答
0

或者简单地将 Window 设置BackgroundTransparent{x:Null}

于 2012-12-21T07:48:18.873 回答