【问题标题】:WPF OnRender Z-Order control?WPF OnRender Z-Order 控件?
【发布时间】:2011-11-12 13:50:03
【问题描述】:

我有一个自定义面板,它实现了其子项的良好自定义布局。我想在面板中添加一些额外的图形,因此覆盖 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>

【问题讨论】:

  • 根据您想要达到的效果,装饰器可能更适合您。使用 Adorner 的主要成本是您必须覆盖 OnRender,并且您已经采用了该成本。 :)

标签: wpf panel z-order onrender


【解决方案1】:

我会让你的“RenderPanel”从画布继承,然后将它放在 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:这实际上是我的建议 - 您可以将它们合并到一个控件中,并将您的画布也添加到控件的内容中。
猜你喜欢
  • 2014-03-28
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多