侦听WPF TextBlock控件的Text属性中的更改

时间:2013-01-25 17:50:19

标签: wpf event-handling ellipsis

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

通过注册侦听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的情况下实现这个目标?

1 个答案:

答案 0 :(得分:4)

您可以使用DependencyPropertyDescriptor

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

PS。为什么地球TextBlock没有IsTrimmed属性超出我的范围。