2

对于 WPF TextBlock,将 TextTrimming 设置为 TextTrimming.CharacterEllipsis 将导致它在文本溢出之前自动切断文本并在末尾添加一些省略号。本文展示了如何检查文本是否被修剪并在修剪时自动在工具提示中显示全文。

它通过注册一个侦听 SizeChanged 事件的事件处理程序来执行此操作,而无需继承 TextBlock:

EventManager.RegisterClassHandler(
    typeof( TextBlock ),
    FrameworkElement.SizeChangedEvent,
    new SizeChangedEventHandler( OnTextBlockSizeChanged ),
    true );

问题是,这只会对大小更改的事件做出反应——如果文本溢出是因为你缩小了控件,它可以正常工作,但如果它因为你更改了文本而溢出,则不会。

不幸的是,虽然 TextBlock 确实有 SizeChangedEvent,但它没有 TextChangedEvent。我想到了听 TargetUpdated 事件:

EventManager.RegisterClassHandler(
    typeof(TextBlock),
    Binding.TargetUpdatedEvent,
    new EventHandler<DataTransferEventArgs>(OnTextBlockTextChanged),
    true);

但这并没有任何明显的效果,即使 NotifyOnTargetUpdated 属性设置为 true。我还尝试覆盖 TextProperty 上的元数据,但似乎只能在其静态构造函数中完成 - 在本例中是 TextBlock 的静态构造函数。有没有办法在不继承 TextBlock 的情况下实现这一点?

4

1 回答 1

4

您可以使用DependencyPropertyDescriptor

var descriptor = DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock));
descriptor.AddValueChanged(...);

PS。为什么地球TextBlock上没有IsTrimmed财产是我无法理解的。

于 2013-01-25T18:17:09.183 回答