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