WPF TextBlock の場合、TextTrimming を TextTrimming.CharacterEllipsis に設定すると、オーバーフローする前にテキストが自動的に切り取られ、最後に省略記号が追加されます。この記事では、テキストがトリミングされているかどうかを確認し、トリミングされている場合はツールヒントに全文を自動的に表示する方法を示します。
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 をサブクラス化せずにこれを達成する方法はありますか?