Изменение шаблона WPF StackPanel - PullRequest
8 голосов
/ 11 июля 2010

Я пытаюсь создать панель пользовательского стиля (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 ]

8 голосов
/ 11 июля 2010

Нет способа установить шаблон 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, если вам это не нужно.

2 голосов
/ 11 июля 2010

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

Например:

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

(непроверенная)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...