侦听WPF TextBlock控件的Text属性中的更改
对于WPF TextBlock,将TEXTTRIMIN设置为TEXTTRIMING.CHARACTERELLISSION将使其在文本溢出之前自动切断文本,并在末尾添加一些省略号。演示如何检查文本是否正在修剪,以及在修剪时如何在工具提示中自动显示全文 它通过注册侦听SizeChanged事件的事件处理程序来实现此目的,而无需对TextBlock进行子类化:侦听WPF TextBlock控件的Text属性中的更改,wpf,event-handling,ellipsis,Wpf,Event Handling,Ellipsis,对于WPF TextBlock,将TEXTTRIMIN设置为TEXTTRIMING.CHARACTERELLISSION将使其在文本溢出之前自动切断文本,并在末尾添加一些省略号。演示如何检查文本是否正在修剪,以及在修剪时如何在工具提示中自动显示全文 它通过注册侦听SizeChanged事件的事件处理程序来实现此目的,而无需对TextBlock进行子类化: EventManager.RegisterClassHandler( typeof( TextBlock ), Framewo
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);
EventManager.RegisterClassHandler(
类型(文本块),
Binding.targetUpdateEvent,
新事件处理程序(OnTextBlockTextChanged),
正确的);
但这并没有任何明显的效果,即使NotifyOnTargetUpdated属性设置为true。我还尝试重写TextProperty上的元数据,但似乎这实际上只能在其静态构造函数中完成——在本例中是TextBlock的静态构造函数。有没有办法在不将TextBlock子类化的情况下实现这一点?您可以使用:
PS.我无法理解为什么TextBlock
没有IsTrimmed
属性。您可以使用:
注:我无法理解为什么
TextBlock
没有IsTrimmed
属性。谢谢你,肯特!我花了一个小时想弄明白!这需要在每个相关的TextBlock
元素上手动调用,并且必须将其删除以防止内存泄漏。我觉得这不是正确的方法。谢谢你,肯特!我花了一个小时想弄明白!这需要在每个相关的TextBlock
元素上手动调用,并且必须将其删除以防止内存泄漏。这不是正确的方法。您可以覆盖任何类型上任何属性的元数据属性。创建自己的静态类,并从类静态构造函数调用TextBox.TextProperty.OverrideMetadata
。您所要做的就是确保调用此构造函数。您可以覆盖任何类型上任何属性的元数据属性。创建自己的静态类,并从类静态构造函数调用TextBox.TextProperty.OverrideMetadata
。您所要做的就是确保调用此构造函数。
var descriptor = DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock));
descriptor.AddValueChanged(...);