更改文本截断行为

时间:2016-11-13 03:49:53

标签: c# xaml windows-runtime uwp textblock

我想在TextBlock中显示路径。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为你想在文字太长的时候修剪左边的文字?如果是这样,没有这样的属性可以设置为帮助UWP中的这项工作,你需要自己修剪它。

这是我的演示:

<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;
    }
}

我的演示只考虑文本很长的场景(ActualWidth&gt; DesiredWidth),如果大小足以容纳文本,您还将实现场景。请注意,此方法仅适用于Loaded事件,因为ActualWidth将更改为其呈现的宽度而不是文本宽度,然后TextBlock将完全呈现。

此外,由于您对Text的{​​{1}}属性使用数据绑定,因此您可以创建TextBlock来修剪文本。