0

RichEditBox で PointerReleased イベントを使用したいのですが、機能しません。

Xaml:

<RichEditBox x:Name="RebText" PointerReleased="RebText_PointerReleased"/>

Xaml.cs:

private void RebText_PointerReleased(object sender, PointerRoutedEventArgs e)
{
    throw new NotImplementedException();
}

前もって感謝します!

4

1 に答える 1

0

うまくいかない理由:

PointerRoutedEventArgsプロパティを持っています。いずれかがこれを true としてマークした場合、イベント ハンドラー チェーンはそれ以上進行しません。Handled boolPointerEventHandlerHandled

ここで、コントロールの設計者は何らかの明白な理由でイベントRichEditBoxをフックする必要があり、ハンドラーでを true にマークしたに違いありません。その結果、イベントに追加したハンドラーは呼び出されません。PointerReleasedHandled

これは、他のコントロールでも発生します。例: 次のように、単に an を追加するだけPointerWheelChangedでは、a のイベントをフックすることはできません。ScrollViewerEventHandler

myScrollViewer.PointerWheelChanged += Some_Handler;

ハンドラーが追加されますが、同じ理由で呼び出されません。

解決:

すべてUIElementの にAddHandlerメソッドがあります。EventHandlerこのメソッドも、オペレーターと同様にイベントに s を追加し+=ますが、次のことができるという利点があります。

イベントが他の場所で処理される場合でも、指定されたハンドラーを呼び出す

だから、あなたがすべきことは、次のようなものです:

RebText.AddHandler(RichEditBox.PointerReleasedEvent, new PointerEventHandler(RebText_PointerReleased), true);

そして次のように定義しますRebText_PointerReleased:

private void RebText_PointerReleased(object sender, PointerRoutedEventArgs e)
{
    // your event handling code here
}

3 番目の引数は、イベントが処理済みとしてマークされている場合でも、このハンドラーを呼び出すことを指定した場所です。

注:、既に処理されたイベントを処理することはお勧めできません。ドキュメントにあるように:

コントロール合成用の Windows ランタイム イベント システムの意図した設計に干渉するため、ルーティング イベントの再処理を定期的に要求しないでください。

于 2019-03-03T06:04:36.190 に答える