WPF自定义文本裁剪

4

我需要进行特殊文本修剪。假设我的字符串是:abcd

默认的修剪会得到这样的结果:ab...

但我需要的是:a..d

有任何想法如何实现它吗?

目前我正在使用

<TextBlock Text="abcdLongWord" TextTrimming="CharacterEllipsis"/>

文本被修剪的标准是什么?您只想要第一个还是最后一个字符? - CodeZombie
ZombieHunter - 我希望显示的人物数量是可配置的,但为了简化起见,我们可以先从一个人物开始。 - Erez
https://dev59.com/QHNA5IYBdhLWcg3wPLP- - Davut Gürbüz
2
我找到了这样的一个函数:http://vt-studio.co.uk/wp/?p=32 - Arvo
你的问题中XML的目的是什么?你想要修剪的字符串只是一个简单的字符串,对吗?就像“如果字符串长度超过X,则仅显示第一个和最后一个字母”,我说得对吗? - Kjartan
Arvo - 看起来你是赢家,请回答并我会接受它。 - Erez
2个回答

1
我曾经有过这方面的担忧,编写了自己的转换器来处理字距调整的过程。
转换器类
internal class KearningConverter : IValueConverter {

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        string result = value.ToString();

        try {
            int length = int.Parse(parameter.ToString());

            if (result.Length > length) {
                result = result.Substring(0, length) + "...";
            }
        } catch {
            result += "...";
        }
        return result;
    }

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

Xaml标记语言
xmlns:conv="clr-namespace:project.converters;assembly=project"

<Window.Resources>
<conv:KearningConverter x:Key="kearnConverter"/>
</Window.Resources>

<TextBlock Text="{Binding Path=AttributeName, Converter={StaticResource kearnConverter}, ConverterParameter=3}"/>

这样,您就可以根据UI布局的不同要求,拥有多种基于kearning的实现。

现在有趣的部分是动态计算ConverterParameter值。如果TextBlock的大小发生变化怎么办?在这种情况下,我们也应该进行修剪,不是吗? - icebat

-3

虽然我没有测试过,但根据您的实际需求,您可能需要:

string test = "abcdefghij";
  int nCharNum = test.Length();
  test.Remove(2, nCharNum - 1); // this will get you "aj"
  //or
  test.Remove(2, 3); // this will result in "adefg..."
  //or
  test.Remove(2, nCharNum - 1);
  test.Insert(2, "..") // this will get you "a..j"

希望这有所帮助。(索引可能需要一些修正)

谢谢,但你建议的不是文本修剪,而是字符串操作,我需要根据 UI 元素宽度来修剪文本,而不是硬编码决定。 - Erez
当文本框的大小小于某个值时,您是否想要替换内部字符?是这样吗? - Łukasz Motyczka
@Erez:你的原始问题中哪里有这个规定?你不能期望在一个不精确的问题中得到“正确”的答案,如果一个回答确实回答了所写的问题,那么它肯定不应该被投票否决。 - Kjartan
我认为这个问题非常精确。 - Matthias

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