Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
侦听WPF TextBlock控件的Text属性中的更改_Wpf_Event Handling_Ellipsis - Fatal编程技术网

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

侦听WPF TextBlock控件的Text属性中的更改,wpf,event-handling,ellipsis,Wpf,Event Handling,Ellipsis,对于WPF TextBlock,将TEXTTRIMIN设置为TEXTTRIMING.CHARACTERELLISSION将使其在文本溢出之前自动切断文本,并在末尾添加一些省略号。演示如何检查文本是否正在修剪,以及在修剪时如何在工具提示中自动显示全文 它通过注册侦听SizeChanged事件的事件处理程序来实现此目的,而无需对TextBlock进行子类化: EventManager.RegisterClassHandler( typeof( TextBlock ), Framewo

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

它通过注册侦听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);
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(...);