2010-07-11 92 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