【问题标题】:Changing WPF StackPanel template更改 WPF StackPanel 模板
【发布时间】:2011-03-14 11:36:35
【问题描述】:

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

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

我希望收到与我写的一样的外观:

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

如果StackPanelControl,我可以替换该控件的DataTemplate。但是,它继承了Panel,后者继承了FrameworkElement
有没有办法改变StackPanel的模板?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    无法为面板设置 ControlTemplate,但您有多种选择:

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

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

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

    4. 继承自 Decorator(如果您在代码中进行绘图)或 ContentControl(如果您想使用 ControlTemplate)并在使用时使用它扭曲您的面板:

           <l:PanelStyle>
               <StackPanel> .. <StackPanel>
           </l:PanelStyle>
      
    5. 为 ItemsControl 编写样式,ItemsControl 有一个 ControlTemplate,您可以设置它并基本上包裹一个面板(默认情况下它是一个垂直 StackPanel)。

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

    【讨论】:

    • 6 年后...抱歉。是否可以提供选项 4 的简短演示?
    【解决方案2】:

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

    例如:

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

    (未测试)

    【讨论】:

    • 这里的问题是所有需要的 StackPanel 属性都必须重新连接。是否存在更简单的解决方案?从 StackPanel 派生然后用装饰器做额外的样式会有帮助吗?
    猜你喜欢
    • 2015-11-30
    • 2013-04-11
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多