对于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的情况下实现这个目标?
答案 0 :(得分:4)
您可以使用DependencyPropertyDescriptor
:
var descriptor = DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock));
descriptor.AddValueChanged(...);
PS。为什么地球TextBlock
没有IsTrimmed
属性超出我的范围。