让我说我想把这个文本放在TextBlock中:
计数一二三四有五六七八九十。
我有一个设置了maxwidth和maxheight的文本块,带有换行。如果文本无法在文本块中修复,它将被截止。要求是显示适合的任何文本(包括换行),但确定哪些文本被截断并将其保存在变量中,以便稍后我可以处理文本,可能稍后在不同的Textblock上。
所以,如果
计算一两三四
是唯一合适的部分,我需要保存
五六七八九十。
关于变量
样品:
----------------
| Counting one |
| two three four |
----------------
我需要保存
五六七八九十。
答案 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 "";
}