Silverlight(至少,从版本 4 开始)没有.WPF的CharacterEllipsis
选项。它可以用在. 这意味着,如果没有足够的空间来显示“这太不可思议了”,我可以修剪为“那是……”,而不是我们想要的“那是令人难以置信的……”。TextTrimming
TextBlock
不过,我们会尝试实现我们的自定义文本修剪功能。基本上,这并不难。一种非常愚蠢的方法是测量字符串的像素,与可用宽度进行比较,然后通过剪切最后一个字符并在文本仍然不适合时在循环中添加“...”来操作字符串。这是一个如何工作的示例:
// Not perfect but good enough for us
private bool AutoTrim(string fullText, TextBlock textBlock, double maxWidth)
{
double factor = maxWidth / textBlock.ActualWidth;
if (factor > 1)
return false;
int newTextLength = (int)Math.Floor((double)fullText.Length * factor);
string trimTest;
do
{
trimTest = fullText.Substring(0, newTextLength--);
textBlock.Text = trimTest + "..."; // problematic...
factor = maxWidth / textBlock.ActualWidth;
}
while (factor < 1 && newTextLength > 0);
return true;
}
但是在代码后面(或在 a 中Behavior
)这样做会导致一些问题:例如,当我们想要更新显示的文本并设置 TextBlock 的TextBlock1.Text = ...
属性时,如果 Text 绑定到 ViewModel 属性,它实际上可能会更改我们的 viewModel。当我们注意到 view 和 viewModel 可能出于某种原因运行不同步时,会出现另一个问题(我们注意到在 ListBox 中)。
您对如何以一种好的方式解决这个问题有更好的想法吗?