【发布时间】:2013-01-09 18:03:47
【问题描述】:
对于 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 的情况下实现这一点?
【问题讨论】:
-
您可以覆盖任何类型的任何属性的元数据属性。创建您自己的静态类并从您的类静态构造函数中调用
TextBox.TextProperty.OverrideMetadata。您所要做的就是确保调用此构造函数。
标签: wpf event-handling ellipsis