Silverlight: шаблон кнопки с обрезкой текста
Я заменяю ContentPresenter шаблона кнопки по умолчанию на TextBlock, чтобы текст можно было обрезать, если он слишком длинный.
Прекрасно работает в WPF. В Silverlight текст сдвигается к одному краю и обрезается слева, даже если справа есть место:
В шаблоне нет ничего особенного, просто заменили ContentPresenter на TextBlock:
<Border x:Name="bdrBackground"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}" />
<Rectangle x:Name="rectMouseOverVisualElement"
Opacity="0">
<Rectangle.Fill>
<SolidColorBrush x:Name="rectMouseOverColor"
Color="{StaticResource MouseOverItemBgColor}"/>
</Rectangle.Fill>
</Rectangle>
<Rectangle x:Name="rectPressedVisualElement"
Opacity="0"
Style="{TemplateBinding Tag}"/>
<TextBlock x:Name="textblock"
Text="{TemplateBinding Content}"
TextTrimming="WordEllipsis"
TextWrapping="NoWrap"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<Rectangle x:Name="rectDisabledVisualElement"
Opacity="0"
Style="{StaticResource RectangleDisabledStyle}"/>
<Rectangle x:Name="rectFocusVisualElement"
Opacity="0"
Style="{StaticResource RectangleFocusStyle}"/>
</Grid>
</ControlTemplate>
Как это исправить?
Больше информации: С последним комментарием о HorizontalAlignment становится ясно, что реализация TextTrimming в SL отличается от реализации WPF. В SL TextTrimming действительно работает, только если текст выровнен по левому краю. SL не достаточно умен, чтобы выровнять текст, как это делает WPF. Например:
Кнопка WPF:
Кнопка SL с горизонтальным выравниванием текстового блока = слева:
Кнопка SL с горизонтальным выравниванием текстового блока = по центру:
2 ответа
Есть еще более простое решение. Я установил TextAlignment= Центр TextBlock. Работает так же, как в WPF. Спасибо за помощь!
Проблема будет в том, что ваш HorizontalContentAlignment
установлен на "Центр". На самом деле WordEllipsis имеет смысл только тогда, когда горизонтальное выравнивание TextBlock установлено на "Left".
редактировать
Получив желаемое поведение, попробуйте это:
<Border HorizontalAlignment="Center"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
<TextBlock x:Name="textblock"
Text="{TemplateBinding Content}"
TextTrimming="WordEllipsis"
TextWrapping="NoWrap"
Margin="{TemplateBinding Padding}" />
</Border>