Изменение шаблона WPF StackPanel
Я пытаюсь создать панель с индивидуальным стилем (StyledStackPanel
), который идентичен обычному StackPanel, который имеет собственный стиль. Например - если стиль просто добавить подчеркивание, написав:
<StyledStackPanel>
<!--User content goes here-->
</StyledStackPanel>
Я хотел бы получить такую же внешность, как если бы я написал:
<StackPanel>
<!--User content goes here-->
</StackPanel>
<Border Height="1" BorderBrush="Blue"/>
Если StackPanel
был Control
Я мог бы заменить DataTemplate
этого контроля. Тем не менее, он наследует Panel
который наследует FrameworkElement
,
Есть ли способ изменить шаблон StackPanel
?
2 ответа
Нет способа установить шаблон 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).
Я бы выбрал вариант 4, если вам нужен доступ к свойствам StackPanel, или 5, если вам это не нужно.
Вы должны создать обычный пользовательский элемент управления, который добавляет его дочерние элементы во внутренний StackPanel
,
Например:
[ContentProperty("Children")]
public class StyledStackPanel : UserControl {
public UIElementCollection Children { get { return stackPanel.Children; } }
}
(Непроверенные)