我正在尝试创建一个自定义样式面板(StyledStackPanel
),它与常规StackPanel相同,具有自定义样式。
例如 - 如果样式只是添加下划线,则写入:
<StyledStackPanel>
<!--User content goes here-->
</StyledStackPanel>
我希望得到与我写的相同的外观:
<StackPanel>
<!--User content goes here-->
</StackPanel>
<Border Height="1" BorderBrush="Blue"/>
如果StackPanel
是Control
,我可以替换该控件的DataTemplate
。但是,它继承了继承Panel
的{{1}}。
有没有办法改变FrameworkElement
的模板?
答案 0 :(得分:8)
无法为面板设置ControlTemplate,但您有几个选项:
创建一个将StackPanel作为子项的自定义/用户控件。
从StackPanel继承并覆盖OnRender以绘制自定义样式(您可能还需要覆盖MeasureOverride和ArrangeOverride以在面板的子项周围为绘图添加一些空间。
直接从Panel继承并覆盖OnRender,MeasureCore和ArrangeCore - 如果您需要使用面板是一种特定的方式而您不需要所有StackPanel的选项,这可能是最简单的方法,因为StackPanel布局算法是简单。
从Decorator继承(如果您在代码中绘图)或ContentControl(如果您想使用ControlTemplate)并在使用它时使用它来扭曲面板:
<l:PanelStyle>
<StackPanel> .. <StackPanel>
</l:PanelStyle>
为ItemsControl编写样式,ItemsControl有一个ControlTemplate,您可以设置它并基本上包装一个面板(默认情况下它是一个垂直的StackPanel)。
如果您需要访问StackPanel的属性,我会使用选项4,如果不需要,我会使用5。
答案 1 :(得分:2)
您应该创建一个普通的自定义控件,将其子元素添加到内部StackPanel
。
例如:
[ContentProperty("Children")]
public class StyledStackPanel : UserControl {
public UIElementCollection Children { get { return stackPanel.Children; } }
}
(未测试的)