2

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 をサブクラス化せずにこれを達成する方法はありますか?

4

1 に答える 1

4

使用できますDependencyPropertyDescriptor

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

PS。地球上にプロパティがTextBlockない理由IsTrimmedは私を超えています。

于 2013-01-25T18:17:09.183 に答える