2011-09-07 108 views
2

我有一個自定義面板,實現了自己的孩子很好的自定義佈局。我想添加一些額外的圖形到面板,所以重寫OnRender添加額外的矩形等。它的工作很好,除了OnRender似乎只是添加到背景。有沒有辦法讓你的OnRender繪圖在兒童之上?WPF OnRender Z順序控制?

一個例子面板...

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

根據你試圖完成的效果,裝飾者可能更適合你。使用Adorner的主要成本是你必須重寫'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> 
+0

但我的RenderPanel正在執行自定義佈局。我想我需要兩個控件。我的自定義面板代替了上面的WrapPanel,以我獨特的方式佈局子項。然後使用OnRender覆蓋額外圖形的另一個自定義面板。 –

+0

@Phil:這實際上是我的建議 - 您可以將它們合併到一個控件中,並將畫布添加到控件的內容中。 –

+0

那麼這是最主要的工作。謝謝。 –