更改文本截断行为

Changing text truncation behavior

我想在 TextBlock 中显示路径。

标准截断最终删除了我想要显示的信息的相关部分,因为它首先截断了行的最右边部分。

有什么方法可以指定 XAML 中的文本应该先从左截断而不是从右截断?设置 FlowDirection 和 TextReadingOrder 似乎对截断的方向没有任何影响,如下所示:

<TextBlock Text="{Binding Path}" FontSize="18" FlowDirection="RightToLeft" TextReadingOrder="UseFlowDirection" TextTrimming="CharacterEllipsis" />

在纯粹的 XAML 中是否可行,或者解决方案是否需要比这更复杂(在调整页面大小时检查文本块的大小并修改文本以进行补偿)?

当文本太长时,我想你想 trim 从左边开始的文本?如果是这样,在 UWP 中没有可以设置的 属性 来帮助这项工作,您需要自己 trim 它。

这是我的演示:

<TextBlock Text="Left-abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
           abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
           abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
           abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
           abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz-Right"
           Margin="0,5" TextWrapping="NoWrap"
           Loaded="TextBlock_Loaded" />

后面的代码:

private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
    var tb = sender as TextBlock;
    //desired width of TextBlock
    var desiredWidth = tb.DesiredSize.Width;
    //cal. char. in string
    var count = tb.Text.Count();
    var reducedText = tb.Text;
    if (reducedText != "")
    {
        //actual width of text
        var textWidth = tb.ActualWidth;
        //trim count
        var trimCount = Math.Ceiling((count / textWidth) * desiredWidth) - 4;
        reducedText = "... " + reducedText.Substring((int)(count - trimCount), (int)trimCount);
        tb.Text = reducedText;
    }
}

我的demo只考虑文字很长的场景(ActualWidth > DesiredWidth),如果文字够大你也可以实现。请注意,此方法仅适用于 Loaded 事件,因为 ActualWidth 将更改为其呈现的宽度而不是文本宽度,然后 TextBlock 将完全呈现。

此外,由于您正在为 TextBlockText 属性 使用数据绑定,您可以创建 converter 到 trim 文本.