Как прочитать первые 5 символов из строки с помощью StringFormat в Windows Phone XAML?

Обычно в моем приложении для Windows Phone я отображал имя в списке через привязку. В этом случае я хочу ограничить имя отображением только первых 5 наборов символов, чтобы избежать ненужного переноса.

На мой взгляд, мы можем добиться этого, используя параметр Converter при привязке Name к TextBox. Но есть ли другой способ добиться этого с помощью самого XAML, используя параметр StringFormat при привязке. Не могли бы вы помочь мне с этим?

<TextBox Text="{Binding Path=Name, StringFormat=??}" TextWrapping="NoWrap"/>

person David Bekham    schedule 22.05.2013    source источник
comment
Глядя на эту статью, я думаю, что что-то вроде StringFormat=\{0,5\} подойдет вам, хотя я не пробовал. blogs.msdn.com/b/matthiasshapiro/archive/2012/12/11/   -  person lhan    schedule 22.05.2013
comment
Спасибо за ответ. Пробовал этот вариант. Но он отображает минимум 5 символов. Если у нас есть имя Том, значит, оно идет с Томом. Так что мне это не помогло.   -  person David Bekham    schedule 22.05.2013
comment
Итак, Name содержит имя и фамилию, а вам нужно полное имя + первые 5 символов фамилии?   -  person lhan    schedule 22.05.2013
comment
Нет. Не существует FirstName и LastName. Если у нас есть имя, состоящее из более чем 5 символов, я должен отображать только первые 5 символов, используя StringFormat. Иногда имя содержит более 15 или 20 символов, что означает ненужную упаковку, поэтому я хочу ограничиться 5.   -  person David Bekham    schedule 22.05.2013
comment
О, понятно, мой пример сработал бы, но вам понадобится способ обрезать начальные пробелы, если имя меньше 5 символов?   -  person lhan    schedule 22.05.2013
comment
Нет. Из вашего решения, если у нас есть 10 символов, он просто отображает все символы. Он не делал никаких опций SubString, чтобы ограничить их только 5.   -  person David Bekham    schedule 22.05.2013
comment
Думаю, понадобится конвертер. Подобные вопросы указывают в этом направлении: stackoverflow.com/questions/9176221/substring -a-bound-string stackoverflow.com/questions/2006111/   -  person anderZubi    schedule 22.05.2013
comment
Есть ли другой способ добиться этого без использования конвертера? Вот какой у меня настоящий вопрос?   -  person David Bekham    schedule 22.05.2013


Ответы (1)


Вы можете использовать свойство TextTrimming объекта TextBlock и создать стиль, содержащий TextBlock внутри вашего TextBox, например:

Стиль 1

<!-- Trims text but shows all on-focus -->
<Style TargetType="TextBox" x:Key='TrimmingStyle1'>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsKeyboardFocused, RelativeSource={RelativeSource Self}}" Value="false">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TextBox">
                        <Border BorderThickness='1' Background='#ffefefef' BorderBrush='LightBlue'>
                            <TextBlock Text="{TemplateBinding Text}" TextTrimming="None" Margin='4,1' />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

Стиль 2

<!-- Trims text always, non editable -->
<Style TargetType="TextBox" x:Key='TrimmingStyle2'>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border BorderThickness='1' Background='#ffefefef' BorderBrush='LightBlue'>
                    <TextBlock Text="{TemplateBinding Text}" TextTrimming="None" Margin='4,1' />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

использование

<TextBox Style="{StaticResource TrimmingStyle1}" ... />
<TextBox Style="{StaticResource TrimmingStyle2}" ... />

Обязательно измените привязки текста в соответствии с данными вашего приложения. Также обратите внимание, что обрезка зависит от размера вашего текстового поля.

Источник: Использование стиля для Имитация обрезки текста в текстовом поле

person aqua    schedule 22.05.2013