WPF OnRender Z-Order 控件是什么?

3

我有一个自定义面板,实现了其子元素的漂亮自定义布局。我想向面板添加一些额外的图形,因此重写OnRender以添加额外的矩形等。它运行良好,除了OnRender似乎只添加到背景中。有没有办法让你的OnRender绘图在子元素的上方?

一个面板示例...

public class RenderPanel : WrapPanel
{
    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);
        drawingContext.DrawRectangle(Brushes.Red, 
                                     new Pen(Brushes.Black, 2), 
                                     new Rect(0, 0, 100, 100));
    }
}

...以这种方式使用...

<Grid>
    <my:RenderPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Button Margin="10" Content="Hello"/>
        <Button Margin="10" Content="Hello"/>
        <Button Margin="10" Content="Hello"/>
        <Button Margin="10" Content="Hello"/>
    </my:RenderPanel>
</Grid>

1
根据您想要实现的效果,装饰器可能更适合您。使用装饰器的主要成本是您必须重写 OnRender 方法,而您已经承担了这个成本。 :) - Greg D
1个回答

1
我建议你让“RenderPanel”继承自Canvas,然后将其放置在WrapPanel上方,并根据需要指定ZIndex。类似这样的代码应该可以实现:

我建议你让“RenderPanel”继承自Canvas,然后将其放置在WrapPanel上方,并根据需要指定ZIndex。类似这样的代码应该可以实现:

<Grid>
    <WrapPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Canvas.ZIndex="0">
        <Button Margin="10" Content="Hello"/>
        <Button Margin="10" Content="Hello"/>
        <Button Margin="10" Content="Hello"/>
        <Button Margin="10" Content="Hello"/>
    </WrapPanel>
    <my:RenderPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Canvas.ZIndex="1" />
</Grid>

但是我的RenderPanel正在执行自定义布局。我想我需要两个控件。我的自定义面板代替上面的WrapPanel以按照我的独特方式布置子元素。然后另一个自定义面板使用OnRender覆盖额外的图形。 - Phil Wright
@Phil:那基本上就是我的建议——你可以将它们合并为一个控件,然后将你的画布添加到控件的内容中。 - Reed Copsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接