WPF TextBlock.TextTrimming 不适用于自动调整大小的 ColumnDefinition

作者:编程家 分类: swift 时间:2025-08-16

,并添加案例代码

在WPF中,TextBlock是一种常用的控件,用于显示文本内容。TextBlock提供了TextTrimming属性,可以用于控制文本溢出时的处理方式。然而,有时候我们需要将TextBlock放置在一个自动调整大小的ColumnDefinition中,而TextTrimming属性似乎不起作用。本文将介绍这个问题,并提供一个解决方案。

问题描述:

当将TextBlock放置在一个自动调整大小的ColumnDefinition中时,TextTrimming属性不起作用。无论设置TextTrimming为什么值,文本都不会被截断,而是会完整显示在ColumnDefinition中。

解决方案:

要解决这个问题,我们可以使用一个自定义的TextBlock控件,它继承自TextBlock,并重写MeasureOverride方法。以下是一个示例代码:

csharp

public class TrimmingTextBlock : TextBlock

{

protected override Size MeasureOverride(Size constraint)

{

// 调用基类的MeasureOverride方法,获取原始的测量大小

Size baseSize = base.MeasureOverride(constraint);

// 如果测量的宽度超过了ColumnDefinition的宽度,则进行截断处理

if (baseSize.Width > constraint.Width)

{

// 获取每个字符的宽度

var charWidth = baseSize.Width / Text.Length;

// 计算可以容纳的最大字符数

var maxChars = (int)(constraint.Width / charWidth);

// 如果文本长度超过了最大字符数,则截断文本

if (Text.Length > maxChars)

{

Text = Text.Substring(0, maxChars) + "...";

baseSize = base.MeasureOverride(constraint);

}

}

return baseSize;

}

}

使用这个自定义的TextBlock控件,可以在自动调整大小的ColumnDefinition中使用TextTrimming功能。以下是一个示例代码:

xaml

TextTrimming="CharacterEllipsis"

Grid.Column="0"/>

Grid.Column="1"/>

在上述示例中,我们在Grid中定义了两个ColumnDefinition,第一个ColumnDefinition中使用了自定义的TrimmingTextBlock控件,并设置了TextTrimming为CharacterEllipsis。这样,当文本超过ColumnDefinition的宽度时,文本将被截断并显示省略号。

通过使用自定义的TextBlock控件,并重写MeasureOverride方法,我们可以在自动调整大小的ColumnDefinition中使用TextTrimming属性。这样,即使文本超过了ColumnDefinition的宽度,我们也可以通过截断文本并显示省略号的方式来处理溢出的文本。这个解决方案可以帮助我们更好地控制文本在自动调整大小的布局中的显示效果。

案例代码:

csharp

public class TrimmingTextBlock : TextBlock

{

protected override Size MeasureOverride(Size constraint)

{

// 调用基类的MeasureOverride方法,获取原始的测量大小

Size baseSize = base.MeasureOverride(constraint);

// 如果测量的宽度超过了ColumnDefinition的宽度,则进行截断处理

if (baseSize.Width > constraint.Width)

{

// 获取每个字符的宽度

var charWidth = baseSize.Width / Text.Length;

// 计算可以容纳的最大字符数

var maxChars = (int)(constraint.Width / charWidth);

// 如果文本长度超过了最大字符数,则截断文本

if (Text.Length > maxChars)

{

Text = Text.Substring(0, maxChars) + "...";

baseSize = base.MeasureOverride(constraint);

}

}

return baseSize;

}

}

xaml

TextTrimming="CharacterEllipsis"

Grid.Column="0"/>

Grid.Column="1"/>

参考资料:

- [WPF TextBlock文本溢出的处理](https://www.cnblogs.com/wangtao_20/p/11981731.html)

- [WPF TextTrimming not working with auto sizing ColumnDefinition](https://stackoverflow.com/questions/43999864/wpf-texttrimming-not-working-with-auto-sizing-columndefinition)