更改WPF StackPanel模板

我正在尝试创建一个自定义样式面板( StyledStackPanel ),它与常规StackPanel相同,具有自定义样式。 例如 – 如果样式只是添加下划线,则写入:

    

我希望收到与我写的相同的外观:

     

如果StackPanel是一个Control ,我可以替换该控件的DataTemplate 。 但是,它inheritance了inheritanceFrameworkElement Panel
有没有办法更改StackPanel的模板?

无法为面板设置ControlTemplate,但您有几个选项:

  1. 创建一个将StackPanel作为子项的自定义/用户控件。

  2. 从StackPanelinheritance并覆盖OnRender以绘制自定义样式(您可能还需要覆盖MeasureOverride和ArrangeOverride以在面板的子项周围为绘图添加一些空间。

  3. 直接从Panelinheritance并覆盖OnRender,MeasureCore和ArrangeCore – 如果您需要使用面板是一种特定的方式,并且您不需要所有StackPanel的选项,这可能是最简单的方法,因为StackPanel布局算法很简单。

  4. 从Decoratorinheritance(如果您在代码中绘图)或ContentControl(如果您想使用ControlTemplate)并在使用它时使用它来扭曲面板:

        ..   
  5. 为ItemsControl编写样式,ItemsControl有一个ControlTemplate,你可以设置它并基本上包装一个面板(默认情况下它是一个垂直的StackPanel)。

如果您需要访问StackPanel的属性,我会使用选项4,如果不需要,我会选择5。

您应该创建一个普通的自定义控件,将其子元素添加到内部StackPanel

例如:

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

(未测试)