WPF: Почему я не должен использовать {TemplateBinding Margin} в ControlTemplate - Margin предназначен только для контейнеров элемента? - PullRequest
9 голосов
/ 05 января 2010

Я создал свой собственный шаблон ControlTemplate для кнопки, например:

<Style x:Key="LightButtonStyle" TargetType="{x:Type ButtonBase}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ButtonBase}">
                <Border
                    x:Name="WrappingBorder"
                    Margin="{TemplateBinding Margin}"
                    ...
                    >
                    <ContentPresenter 
                        Content="{TemplateBinding Content}" 
                        ...
                        >
                    </ContentPresenter>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Теперь я заметил, что когда я устанавливаю поле для моей кнопки, например:

<Button 
    Style="{StaticResource LightButtonStyle}"
    Margin="20"
    >
    Hello world!
</Button>

кнопка фактически имеет двойное поле Margin - 40. Я предположил, что элемент управления фактически не должен использовать Margin, и что свойство Margin доступно только для предков кнопки во время фазы аранжировки. Затем я посмотрел на стили WPF по умолчанию и обнаружил, что никто из них не использовал Margin.

Является ли это правильным выводом (что маржа контролируется только для правильного размещения в контейнерах)? Другими словами, каждый раз, когда я использую {TemplateBinding Margin} в своем стиле, я получу двойные поля вместо этого? И есть ли список похожих свойств, которые мой элемент управления не должен использовать (поскольку они предназначены только для «окружающего мира»)?

Не могли бы вы указать мне страницу MSDN, которая объясняет это? Спасибо!

EDIT:

Полагаю, я должен найти ответы в http://msdn.microsoft.com/en-us/library/ms745058.aspx и http://msdn.microsoft.com/en-us/library/ms751709.aspx,, но я не думаю, что они прямо упоминали, что это никогда элемент управления, который использует свойство Margin, что это всегда система-предок или wpf, которая оценивает ее и использует для воздействия на макет ...

Ответы [ 2 ]

6 голосов
/ 05 января 2010

Ваш вывод верен, если вы посмотрите на шаблоны, предоставленные по умолчанию, вы увидите, что Margin внутри шаблона привязано к свойству Padding элемента управления.

5 голосов
/ 05 января 2010

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

<Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... />
...