Silverlight: шаблон кнопки с обрезкой текста - PullRequest
3 голосов
/ 23 декабря 2010

Я заменяю ContentPresenter шаблона кнопки по умолчанию на TextBlock, чтобы текст можно было обрезать, если он слишком длинный.

Прекрасно работает в WPF.В Silverlight текст выдвигается к одному краю и обрезается слева, даже если справа есть место:

alt text

В шаблоне нет ничего особенного, просто замените 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:

alt text

Кнопка SL с горизонтальным выравниванием текстового блока = слева:

alt text

Кнопка SL с горизонтальным выравниванием текстового блока = по центру:

alt text

Ответы [ 2 ]

3 голосов
/ 27 декабря 2010

Есть еще более простое решение.Я установил TextAlignment = Центр TextBlock.Работает так же, как в WPF.Спасибо за помощь!

2 голосов
/ 23 декабря 2010

Проблема будет в том, что ваш 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>
...