替换Silverlight中缺少TextTrimming选项"CharacterEllipsis"

thm*_*shd 2 silverlight silverlight-4.0 texttrimming

的Silverlight(至少,如第4版的)不具有CharacterEllipsis选项TextTrimming,这WPF具有.它可以用于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;
}
Run Code Online (Sandbox Code Playgroud)

但是在代码后面(或在代码中Behavior)执行此操作会导致一些问题:例如,当我们想要更新显示的文本并设置TextBlock的TextBlock1.Text = ...属性时,如果Text绑定到ViewModel属性,它实际上可能会更改我们的viewModel.另一个问题出现了,因为我们注意到view和viewModel可能由于某种原因而运行同步(我们注意到在ListBox中).

你对如何以一种好的方式解决这个问题有了更好的想法吗?

bka*_*aid 5

Robby Ingebretsen的DynamicTextBox通过将TextBlock包装在自定义控件中并测量可用大小来实现此目的.它匹配WPF的CharacterEllipsis文本修剪模式.WordEllipsis模式确实被添加到Windows Phone 7 Mango,但这在这里没有多大帮助.