10

是否有可能像在 HTML 中那样为 Textblock 提供自动换行建议,<SHY> (soft hyphen)或者<WBR> (word break)甚至更复杂且不易维护zero-width-space &#8203;

目前,Textblock 会根据需要中断单词,最终以换行形式结束,例如

堆栈
溢出

我想要的是:

堆栈
溢出

或者至少:

堆叠

如果有推荐的方法来实现所需,请告诉我。

4

2 回答 2

4

设置TextBlock.IsHypenationEnabled为 true 实际上会做类似的事情,但是如果你想使用标签,你可以使用这样的方法:

    /// <summary>
    /// Adds break to a TextBlock according to a specified tag
    /// </summary>
    /// <param name="text">The text containing the tags to break up</param>
    /// <param name="tb">The TextBlock we are assigning this text to</param>
    /// <param name="tag">The tag, eg <br> to use in adding breaks</param>
    /// <returns></returns>
    public string WordWrap(string text, TextBlock tb, string tag)
    {
        //get the amount of text that can fit into the textblock
        int len = (int)Math.Round((2 * tb.ActualWidth / tb.FontSize));
        string original = text.Replace(tag, "");
        string ret = "";
        while (original.Length > len)
        {
            //get index where tag occurred
            int i = text.IndexOf(tag);
            //get index where whitespace occurred
            int j = original.IndexOf(" ");
            //does tag occur earlier than whitespace, then let's use that index instead!
            if (j > i && j < len)
                i = j;
            //if we usde index of whitespace, there is no need to hyphenate
            ret += (i == j) ? original.Substring(0, i) + "\n" : original.Substring(0, i) + "-\n";
            //if we used index of whitespace, then let's remove the whitespace
            original = (i == j) ? original.Substring(i + 1) : original.Substring(i);
            text = text.Substring(i + tag.Length);
        }
        return ret + original;
    }

这样你现在可以说:

textBlock1.Text = WordWrap("StackOver<br>Flow For<br>Ever", textBlock1, "<br>");

这将输出:

刚刚测试

但是,仅使用不带标签的 IsHyphenated,它将是:

IsHypehnated Scenario1

尽管:

textBlock1.Text = WordWrap("StackOver<br>Flow In<br> U", textBlock1, "<br>");

将输出:

此处不添加 <brs>

并且 IsHyphenated 没有标签:

IsHyphenated 场景 2

编辑: 在减小字体大小时,我发现我发布的第一个代码不喜欢在用户指定的中断出现空格的地方添加中断。

于 2012-07-13T07:06:02.347 回答
3

TextFormatter与 custom 结合使用TextSource来控制文本的分解和包装方式。

您需要从 TextSource 派生一个类,并在您的实现中分析您的内容/字符串并提供您的包装规则,例如寻找您的 <wbr> 标签...当您看到一个标签时,您返回一个TextEndOfLineelse 您返回一个TextCharacters.

可以帮助实现 a 的示例TextSource如下:

对于一个非常高级的示例,请查看也使用它的“AvalonEdit”:

GlyphRun如果您不需要丰富的格式,您也可以进行调查。

于 2012-07-12T13:27:50.023 回答