更改文本截断行为

Posted

技术标签:

【中文标题】更改文本截断行为【英文标题】:Changing text truncation behavior 【发布时间】:2017-03-27 00:08:56 【问题描述】:

我想在 TextBlock 中显示路径。

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

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

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

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

【问题讨论】:

你检查我的答案了吗?有什么问题吗? 【参考方案1】:

我想当文本太长时你想从左边修剪文本?如果是这样,在 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 > DesiredWidth),如果大小足以容纳文本,您也将实现该场景。请注意,此方法仅适用于 Loaded 事件,因为 ActualWidth 将更改为其呈现的宽度而不是文本宽度,然后 TextBlock 被完全呈现。

此外,由于您正在为TextBlockText 属性使用数据绑定,因此您可以创建一个converter 来修剪文本。

【讨论】:

以上是关于更改文本截断行为的主要内容,如果未能解决你的问题,请参考以下文章

IE 9 - 更改字体大小后文本框中的文本被截断(百分比)

更改文本时 UILabel 中等宽字体的奇怪行为

更改 AngularJS ngTrim 行为

更改 TextInputLayout 提示行为

更改 asp 按钮行为

Vue:如何在按住键盘修饰符时更改按钮的文本?