RichTextBox for UWP
ヒットテスト
RichTextBox の使い方 > 主要な概念と機能 > ヒットテスト

C1RichTextBox は、ユーザーの対話式操作を実装するための標準メカニズムとしてハイパーリンクをサポートします。さらに、カスタムのマウス対話機能を追加して提供することもできます。たとえば、ユーザーが要素をクリックしたときに、カスタム書式を適用したり、コンテキストメニューを表示することができます。

このようなシナリオを可能にするために、C1RichTextBox には、ElementTapped イベントと C1RichTextBox.GetPositionFromPoint メソッドが公開されています。

マウスイベントをトリガした要素を確認するだけでよい場合は、イベントハンドラの source パラメータから取得できます。より詳細な情報(要素内でクリックされた単語など)が必要な場合は、C1RichTextBox.GetPositionFromPoint メソッドが必要です。C1RichTextBox.GetPositionFromPoint はクライアント座標でポイントを受け取り、その位置をドキュメント座標で表す C1TextPosition オブジェクトを返します。

C1TextPosition オブジェクトには、ElementOffset という2つの主要なプロパティがあります。Element プロパティはドキュメント内の要素を表し、Offset プロパティは文字インデックス(要素が C1Run の場合)または指定されたポイントにある子要素のインデックスです。

たとえば、次のコードは、C1RichTextBox を作成し、ハンドラを C1RichTextBox.RightTapped イベントに関連付けます。

C# コードの書き方

C#
コードのコピー
public sealed partial class MainPage : Page
    {
        C1RichTextBox rtb;

        public MainPage()
        {
            this.InitializeComponent();

            // C1RichTextBox を作成してページに追加します
            rtb = new C1RichTextBox();
            LayoutRoot.Children.Add(rtb);

            // イベントハンドラを関連付けます
            rtb.RightTapped += rtb_RightTapped;
        }

1つの単語の C1TextElement.FontWeight 値を切り替える場合は、クリックされた文字を特定してから選択範囲を単語全体に拡張する必要があります。ここで C1RichTextBox.GetPositionFromPoint メソッドが必要になります。次に、これを行うイベントハンドラを示します。

C# コードの書き方

C#
コードのコピー
void rtb_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
   // コントロール座標で位置を取得します
       var pt = e.GetPosition(rtb);
   // その位置のテキストポインタを取得します
       var pointer = rtb.GetPositionFromPoint(pt);
   // ポインタが C1Run をポイントしていることを確認します
       var run = pointer.Element as C1Run;
         if (run != null)
          {
   // C1Run 内の単語を取得します
       var text = run.Text;
       var start = pointer.Offset;
       var end = pointer.Offset;
        while (start > 0 && char.IsLetterOrDigit(text, start - 1))
        start--;
       while (end < text.Length - 1 && char.IsLetterOrDigit(text, end + 1))
        end++;
   // クリックされたランの太字プロパティを切り替えます
       var word = new C1TextRange(pointer.Element, start, end - start + 1);
        word.FontWeight = word.FontWeight.HasValue && word.FontWeight.Value.Weight == FontWeights.Bold.Weight
         ? FontWeights.Normal
         : FontWeights.Bold;
        }
     }

  }

}

C1TextElement.FontWeight プロパティは、 null 可能な値を返します。この範囲内で、この属性に複数の値が混ざって含まれる場合、このプロパティは null を返します。C1TextElement.FontWeight プロパティを切り替えるために使用するコードは、以前に書式設定ツールバーを実装したときに使用したコードと同じです。

GetPositionFromPoint メソッドを使用すると、画面上のポイントから C1TextPosition オブジェクトを取得できます。GetRectFromPosition メソッドは逆の操作を実行します。すなわち、C1TextPosition オブジェクトの画面上の位置を表す Rect を返します。これは、ドキュメントの特定部分の近くに UI 要素を表示するような場合に役立ちます。