Изменение шаблона 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 для панели, но у вас есть несколько вариантов:

  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).

Я бы выбрал вариант 4, если вам нужен доступ к свойствам StackPanel, или 5, если вам это не нужно.

Вы должны создать обычный пользовательский элемент управления, который добавляет его дочерние элементы во внутренний StackPanel,

Например:

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

(Непроверенные)

Другие вопросы по тегам