2010-07-11 61 views
8

我想創建一個自定義樣式面板(StyledStackPanel),它與常規StackPanel相同,具有自定義樣式。 例如 - 如果風格是簡單地添加下劃線,通過寫更改WPF StackPanel模板

<StyledStackPanel> 
    <!--User content goes here--> 
</StyledStackPanel> 

我希望收到相同的外觀,就好像我寫道:

<StackPanel> 
    <!--User content goes here--> 
</StackPanel> 
<Border Height="1" BorderBrush="Blue"/> 

如果StackPanelControl,我可以替換該控件的DataTemplate。但是,它繼承Panel,它繼承FrameworkElement
有沒有辦法改變StackPanel的模板?

回答

6

有沒有辦法來設置面板的控件模板,但你有幾種選擇:

  1. 創建自定義/將StackPanel作爲子項的用戶控件。

  2. 繼承StackPanel中,並直接從面板和重寫覆蓋的OnRender繪製自定義樣式(您可能還需要重寫的MeasureOverride和ArrangeOverride添加圍繞面板的孩子一點空間,爲您繪製。

  3. 繼承OnRender,MeasureCore和ArrangeCore - 如果你需要使用面板是一種特定的方式,你不需要所有的StackPanel的選項,這可能是自從StackPanel佈局算法很簡單的最簡單的方法。你在代碼中做你的繪圖)或ContentControl(如果你想使用ControlTemplate)和WA它RP您面板,當你使用它:

     <l:PanelStyle> 
         <StackPanel> .. <StackPanel> 
        </l:PanelStyle> 
    
  4. 寫出ItemsControl的風格,ItemsControl的有,你可以設置一個控件模板,基本上包裝了一個面板(默認情況下它是一個垂直的StackPanel)。

如果你需要訪問StackPanel的屬性,或者如果你不需要訪問StackPanel的屬性,我會選擇4。

+0

6年後...對不起。是否可以投入選項4的簡要演示? – matrixugly 2016-02-14 00:24:47

1

您應該製作一個正常的自定義控件,將其子元素添加到內部StackPanel

例如:

[ContentProperty("Children")] 
public class StyledStackPanel : UserControl { 
    public UIElementCollection Children { get { return stackPanel.Children; } } 
} 

(未經測試)

+3

這裏的問題是所有需要的StackPanel屬性必須重新連線。是否存在更簡單的解決方案?它有助於從StackPanel派生,然後與裝飾者做附加的風格? – HCL 2010-07-11 13:43:17