【问题标题】:Customise text trimming in WPF TextBlock在 WPF TextBlock 中自定义文本修剪
【发布时间】:2012-11-18 21:37:19
【问题描述】:

我的 WPF 视图中有一个 TextBlock 元素,它数据绑定到视图模型中的字符串属性。现在,此属性中的文本可以变得更长一些,因此应将其修剪为单行显示。布局不应更改,因此必须避免使用多行。此外,不应更改数据绑定源并保持单个字符串。要显示的文本类似于以下示例:

  • XY 的一些对象
  • ABC 的另一个对象
  • 3 个模糊对象(XY、ABC、DEF)
  • 20 个很棒的对象(XY #1、#2、ABC #2、#3、DEF、GHI,还有一些,还有更多)

简单的解决办法是这样的:

<TextBlock Text="{Binding PageTitle}" TextTrimming="CharacterEllipsis"/>

这适用于前两个示例文本,但在最后两个示例中,我希望右括号保持可见。所以我目前得到的是这样的:

  • 20 个很棒的对象(XY #1、#2、ABC #2、#3、DEF...

但我想要的是:

  • 20 个很棒的对象(XY #1、#2、ABC #2、#3、DEF...

WPF 中是否有一种简单的方法可以做到这一点?基本上,省略号字符串现在总是三个点(从视觉上看,也可能是 Unicode 字符),它需要是可变的,并且包括源字符串中包含的任何结束标点符号。

如有必要,我可以为此编写一个自定义控件,但在实现修剪方面也需要帮助。

【问题讨论】:

    标签: wpf trim textblock


    【解决方案1】:

    简单的方法:使用DockPanel,在其中放入两个TextBlock,第一个显示带有省略号修剪的字符串,第二个显示右括号,停靠在右侧:

    <DockPanel>
        <TextBlock Text=")" DockPanel.Dock="Right" />
        <TextBlock Text="{Binding PageTitle}" TextTrimming="CharacterEllipsis" />
    </DockPanel>
    

    如果你想自己修剪,可以看看我在这篇文章中的回答:Ellipsis at start of string in WPF ListView

    【讨论】:

    • 好主意!刚刚在 Kaxaml 中尝试过,它似乎运行良好。需要设置&lt;DockPanel HorizontalAlignment="Left"&gt;,避免拉伸,去掉省略号和最终TextBlock之间的空隙。谢谢!
    【解决方案2】:

    我没有适合您的实现,但由于您使用的是绑定,我会考虑使用转换器而不是自定义控件。您可以访问转换方法的 args 中所需的所有内容,以计算要显示多少字符串并完全控制它的显示方式,而无需修改视图模型中的数据。

    【讨论】:

    • 好吧,我不明白你的意思,所以我想我需要一个实现或更多细节。转换器如何知道视图中有多少空间?如何自己进行文本宽度计算?视图调整大小时会更新吗?
    • Convert方法中如何获取文本块的宽度?
    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 2020-09-02
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多