【问题标题】:Can you limit the length of Text visible in a WPF TextBlock?您可以限制 WPF TextBlock 中可见文本的长度吗?
【发布时间】:2011-08-24 05:25:57
【问题描述】:

我有一个绑定到数据库查询结果的列表框。我正在使用在一行上显示主题的项目模板,我希望它在另一行上显示正文的预览。我想知道的是——很明显,身体太长了,不能放在那里,我可以以某种方式将它设置为只显示前这么多字符并在之后附加一个省略号,就像预览一样?或者即使是接近的东西也可以。比如:

而不是显示:

Lorem ipsum dolor sit amet,consectetur adipiscing elit。悬念 简历爱神nibh。 Pellentesque 居民 morbi tristique senectus et netus et 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 vehicula 非。 Mauris nec ipsum velit。赛德和拍卖师 尼布。 Proin ac ultricies Tellus。

它会显示类似的东西

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 暂停...

有什么想法吗?

【问题讨论】:

    标签: wpf truncate textblock


    【解决方案1】:

    您可以使用文本块的“TextTrimming”属性。设置 TextTrimming = "CharacterEllipsis"。您可能需要使用 Width 来管理您真正想要显示的字符数。

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

    在您的项目模板中添加此文本块

    【讨论】:

    • 我在发布问题后几乎立即发现了这一点。但是我遇到了一个问题,如果有回车,它会修剪每一行,但仍然显示每一行。在这些情况下,我只想显示第一行。这可能吗?
    【解决方案2】:

    当然!

    <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();
        }
    }
    

    看起来像:

    祝你好运!

    【讨论】:

    • 顺便说一句,使用 TextTrimming 的问题在于它是基于 TextBlock 的大小而不是文本的长度。有时这正是你想要的,我意识到。但就您的问题而言,我相信您是想根据文本的长度来确定。
    • 我知道你用它去了哪里,我知道这就是我将来最终想要的,当然。但目前,我希望它基于文本块大小。这样,如果我想多预览一点,我可以把它拖出来。但我肯定会深入研究你的例子。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2012-12-23
    • 2017-04-06
    • 2015-10-30
    • 2020-09-21
    • 2011-10-29
    • 2022-11-01
    相关资源
    最近更新 更多