【发布时间】:2011-09-01 21:35:44
【问题描述】:
Silverlight(至少从第 4 版开始)没有 CharacterEllipsis 选项用于 TextTrimming,WPF has。它可以用于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;
}
但是在代码后面(或Behavior)中这样做会导致一些问题:例如,当我们想要更新显示的文本并设置TextBlock的TextBlock1.Text = ...属性时,它实际上可能会改变我们的viewModel,如果文本绑定到 ViewModel 属性。当我们注意到 view 和 viewModel 可能出于某种原因运行不同步时,另一个问题出现了(我们注意到在 ListBox 中)。
您对如何以一种好的方式解决这个问题有更好的想法吗?
【问题讨论】:
标签: silverlight silverlight-4.0 texttrimming