Проблема заключается в том, что при присвоении строки Content
в ContentPresenter
Silverlight необходимо создать форму TextBlock
для представления строки. Это позиция этого TextBlock
, которая не центрирована в вертикальном пространстве, обеспеченном ContentPresenter
. Измените кнопку следующим образом: -
<Button Style="{StaticResource CellStyle}">
<TextBlock Text="A" VertialAlignment="Center" />
</Button>
исправит это. Однако вы можете просто указать простую строку Content и отцентрировать ее. В этом случае вы можете изменить свой шаблон: -
<Border x:Name="CellBorderBrush" BorderBrush="Black" BorderThickness="1">
<StackPanel VerticalAlignment="Center"HorizontalAlignment="Center">
<ContentPresenter Content="{TemplateBinding Content}" />
</StackPanel>
</Border>
Поместив ContentPresenter
в StackPanel
, ContentPresenter
примет минимальную высоту, необходимую для отображения его содержимого. StackPanel
, в свою очередь, имеет только высоту своего содержимого, а затем он центрируется внутри Border
.
Если бы я строил это, это было бы так: -
<UserControl x:Class="SilverlightApplication1.Test"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<UserControl.Resources>
<ControlTemplate x:Key="CellTemplate" TargetType="Button">
<Grid>
<Border x:Name="CellBorderBrush"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}" />
<ContentPresenter
x:Name="contentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"/>
</Grid>
</ControlTemplate>
<Style x:Key="CellStyle" TargetType="Button">
<Setter Property="Template" Value="{StaticResource CellTemplate}" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontSize" Value="80" />
<Setter Property="Width" Value="100" />
<Setter Property="Height" Value="100" />
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="1" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Button Style="{StaticResource CellStyle}">
<TextBlock Text="A" VerticalAlignment="Center" />
</Button>
</Grid>
</UserControl>
Это более общий подход к кнопке. Конечно, хорошо использовать более простые и понятные шаблоны, когда стиль используется для очень специфических локальных целей.