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>
Другие вопросы по тегам