WPF保存修剪的文本

时间:2014-07-31 02:36:02

标签: wpf textblock

让我说我想把这个文本放在TextBlock中:

  计数一二三四有五六七八九十。

我有一个设置了maxwidth和maxheight的文本块,带有换行。如果文本无法在文本块中修复,它将被截止。要求是显示适合的任何文本(包括换行),但确定哪些文本被截断并将其保存在变量中,以便稍后我可以处理文本,可能稍后在不同的Textblock上。

所以,如果

  

计算一两三四

是唯一合适的部分,我需要保存

  五六七八九十。

关于变量

样品:

 ----------------
| Counting one   |
| two three four |
 ----------------

我需要保存

  五六七八九十。

1 个答案:

答案 0 :(得分:0)

您可以使用FormattedText来获取TextBlock的宽度:

string text = "Counting one two three four five six seven eight nine ten";
var formattedText = new FormattedText(
    text,
    CultureInfo.CurrentUICulture,
    FlowDirection.LeftToRight,
    new Typeface(theTextBlock.FontFamily, theTextBlock.FontStyle, theTextBlock.FontWeight, theTextBlock.FontStretch),
    theTextBlock.FontSize,
    Brushes.Black);

所以基本上,它是迭代单词并计算每个单词长度的问题,直到你超过最大长度......(未经测试,但希望不会太远)......

Func<string, double> GetWidthFunc(TextBlock textBlock)
{
    return text => {
        var formattedText = new FormattedText(
        text,
        CultureInfo.CurrentUICulture,
        FlowDirection.LeftToRight,
        new Typeface(theTextBlock.FontFamily, theTextBlock.FontStyle, theTextBlock.FontWeight, theTextBlock.FontStretch),
        theTextBlock.FontSize,
        Brushes.Black);
        return formattedText.Width;
    };
}

string GetRemainingText(TextBlock textBlock)
{
    Func<string, double> getWidth = GetWidthFunc(textBlock);
    double maxWidth = textBlock.MaxWidth;
    string[] words = textBlock.Text.Split(' ');
    double totalLength = 0;
    for (int i = 0 ; i < words.Length ; i++)
        if ( (totalLength += getWidth(words[i] + (i > 0 ? " " : "") ) ) > maxWidth )
            return string.Join(" ", words.Skip(i));
    return "";
}