【问题标题】:Listening to changes in the Text property of the WPF TextBlock control侦听 WPF TextBlock 控件的 Text 属性中的更改
【发布时间】: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


【解决方案1】:

你可以使用DependencyPropertyDescriptor:

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

PS。为什么TextBlock 没有IsTrimmed 属性是我无法理解的。

【讨论】:

  • 谢谢肯特!我花了一个小时试图弄清楚这一点!
  • 这需要在每个相关TextBlock元素上手动调用,并且它也必须被移除以防止内存泄漏。恕我直言,这不是正确的方法。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2014-11-10
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多