使用省略号和冒号实现文本截断

29

这是一个相对简单的问题:

我可以使用以下代码将文本进行裁剪并添加省略号:

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

我想得到的结果是:

"This sentence ...:" / "This sentence...:"

目标是在省略号后面加上冒号。有没有简单的方法实现这个功能?

编辑:

抱歉让你们感到困惑。

我想改变默认的省略符号从'...'到'...:'。同时,在文本字符串中我会加入一个冒号。这样,我将始终显示冒号。此外,在任何情况下,所有内容都应该在一行上。

以下是可接受的结果之一:

长度足够短:

way too l...:


1
你把TextWrappingTextTrimming搞混了。 - Clemens
哈哈,是的。我复制了错误的 XAML 行 -_- - FZdev
请查看“如何确定我的TextBlock文本是否被裁剪?”链接,从那里开始就可以完成了。 - hennson
我并不完全确定那是我想要的效果。实际上,我试图将默认的省略字符串从“...”更改为“...:”。 - FZdev
3个回答

33

这个方法是可行的,但我需要添加一些填充(padding)使冒号始终可见:

<TextBlock Padding="0,0,5,0" >
    <TextBlock TextTrimming="CharacterEllipsis">Lorem ipsum dolor sit amet, consectetur adipisicing </TextBlock>
    <TextBlock>:</TextBlock>
</TextBlock>

这个很好用,只是在某些点上,冒号文本块似乎被文本文本块遮挡了。不过,这是最简单的工作情况。 - FZdev
是的,我认为添加填充解决了这个问题。希望你能够让它工作,也许在第二个TextBlock上加上填充。 - Phil
包装器的填充绝对有帮助(实际上,我已经在所有其他容器中使用了它)。 在冒号TB的左侧添加填充实际上比您的实现更糟。 也许通过调整值和应用填充的哪一侧可能会修复所有问题; 但是,由于您的示例已足够用于演示目的,所以现在不值得这样做。 - FZdev
1
请查看<Span>和<Run>元素。文本由<Span>类型组成,这是一个通常工作的较低级别,但它允许您在字符串中突出显示子字符串。例如,请参见“绑定Span的内容”https://dev59.com/0HA75IYBdhLWcg3wVXWv - Tom A

2

使用两个TextBlocks,第一个显示省略号示例,第二个显示冒号。

更新:

看起来这是一个相对简单的问题,但存在许多复杂性。

有人可能会想要使用一些TextBlocks,第一个显示目标文本,另外两个分别显示“:”和“...:”,并根据第一个TextBlock是否有足够的空间来显示其所有文本,使用可见性值转换器在它们之间进行切换。这种方法有可能实现,但可能导致不稳定的布局。

刚刚实现了一个自定义面板,我可以想象出一种可能的解决方案,其中一个设计用于容纳三个子元素,这三个子元素将是上述三个TextBlocks。

从Panel继承的自定义面板应该重写两个关键方法:Measure和Arrange。

在Measure方法中,应该测量所有的子元素。

在Arrange方法中,检查是否有足够的空间来显示前两个子元素,如果有,则将它们并排放置。如果没有足够的空间,则显示第一个子元素的大小以允许第三个子元素有足够的空间来显示,并将第三个子元素右对齐。

更新:

我尝试了自定义面板,它可以工作,但第一个TextBox剪辑了部分字符。

清洁格式的最终解决方案将是一种方法,该方法调整显示字符串,直到其适合所分配的空间,并应用适当的后缀。


并且始终显示冒号,即使没有省略号? - Clemens
Clemens - 对于混淆感到抱歉,但我确实想要冒号始终显示Doug - 这通常是我想要的效果。 我已经尝试过,并且在某些宽度下,冒号会掉到下一行。 那不够好。 两个文本块位于水平wrappanel内,该wrappanel位于dockpanel内,该dockpanel位于listboxitem内。 左侧还有一个图像控件停靠在wrappanel上。 - FZdev
@FZdev,为什么不直接将这两个TextBlock放在一个水平的DockPanel中呢?首先是冒号TextBlock,其次是修剪后的TextBlock,并且在两者上设置适当的DockPanel.Dock值。因此,默认情况下,修剪后的TextBlock会填充所有未被冒号占用的空间。或者更好的方法是使用Grid。 - Clemens
啊,关于网格和停靠的问题是当字符串不是很长(而屏幕非常宽)时,冒号和字符串会分离。 - FZdev
使用自动列来分隔冒号和文本意味着文本根本不会换行。看起来应该有一种限制大小的方法,但我现在想不出来。 - FZdev

0

如果您的字符串中不包含冒号,您可以使用Binding.StringFormat

<TextBlock Text="{Binding, StringFormat={}{0}:}" TextTrimming="CharacterEllipsis"/>

(我知道这是一个非常老的问题,但我碰巧看到了它,所以我想为其他人提供一些帮助。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接