Можете ли вы ограничить длину текста, видимого в текстовом блоке WPF? - PullRequest
4 голосов
/ 24 августа 2011

У меня есть список, связанный с результатом запроса к базе данных.Я использую шаблон элемента, который показывает предмет в одной строке, и я хочу, чтобы он отображал предварительный просмотр тела в другой строке.Что мне интересно, так это то, что тело, очевидно, будет слишком длинным, чтобы поместиться в нем, могу ли я как-то настроить его так, чтобы оно отображало только первые столько символов и добавляло эллипсы после этого, как предварительный просмотр?Или даже что-то близкое было бы хорошо.Так, например:

Вместо отображения:

Lorem ipsum dolor sit amet, элитный администратор Adipiscing.Suspendisse Vitae Eros Nibh.Пеллетентный обитатель Morbi Tristique Senectus et netus и malesuada славится ac turpis egestas.Donec augue metus, iaculis id porta non, pellentesque quis turpis.Donec rutrum diam eget tortor bibendum vel blandit odio iaculis.Curabitur pretium adipiscing orci, ut pulvinar justo vehicleula non.Mauris nec ipsum Velit.Sed et auctor nibh.Proin ac ultricies Tellus.

Это будет отображать что-то вроде

Lorem ipsum dolor sit amet, consitteur adipiscing elit.Suspendisse ...

есть идеи?

Ответы [ 2 ]

11 голосов
/ 24 августа 2011

Вы можете использовать свойство TextTrimming для текстового блока.Установите TextTrimming = "CharacterEllipsis".Возможно, вам придется поиграть с Width, чтобы определить, сколько символов вы действительно хотите отобразить.

<TextBlock TextTrimming="CharacterEllipsis" Text="This is a sample long text. This will get Trimmed."/>

Добавьте этот текстовый блок в шаблон вашего элемента

6 голосов
/ 24 августа 2011

Конечно!

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <sys:String x:Key="MyData">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse vitae eros nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec augue metus, iaculis id porta non, pellentesque quis turpis. Donec rutrum diam eget tortor bibendum vel blandit odio iaculis. Curabitur pretium adipiscing orci, ut pulvinar justo vehicula non. Mauris nec ipsum velit. Sed et auctor nibh. Proin ac ultricies tellus.</sys:String>
        <local:MyTruncateConverter x:Key="MyConverter" />
    </Window.Resources>
    <TextBlock Text="{Binding Source={StaticResource MyData},
        Converter={StaticResource MyConverter}, 
        ConverterParameter=50}" 
        TextWrapping="Wrap" />
</Window>

Тогда используйте этот конвертер:

public class MyTruncateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return string.Empty;
        if (parameter == null)
            return value;
        int _MaxLength;
        if (!int.TryParse(parameter.ToString(), out _MaxLength))
            return value;
        var _String = value.ToString();
        if (_String.Length > _MaxLength)
            _String = _String.Substring(0, _MaxLength) + "...";
        return _String;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Похоже:

Shot

Удачи!

...