none
WPF CANVAS上のshapeをマウスで引いた自由曲線の範囲から検索したい RRS feed

  • 質問

  • WPFのCANVASに複数のshape(TextBlockやLineなど)を配置しています。
    CANVAS上をマウスでドラッグした範囲内にあるshapeを取得したいと思っています。

    以下の方法でドラッグした軌跡からPathGeometryを生成しHITTESTしているのですが全くヒットしません。

    =================
    マウスドラッグ時にPathFigureを生成しています。

    Private Sub myCanvas_MouseDown(....
     figu.StartPoint = point
    End Sub
    Private Sub myCanvas_MouseMove(....
     figu.Segments.Add(New LineSegment(point, True))
    End Sub

    ドラッグ完了時にCANVAS内のshape1つ1つにHitTestをしているのですが、
    全くヒットしません。
    Private Sub myCanvas_MouseUp(....
     myPathGeometry.Figures.Add(figu)
     ....
     VisualTreeHelper.HitTest(wktxtblock, Nothing, New HitTestResultCallback(AddressOf MyHitTestResultCallback), New GeometryHitTestParameters(myPathGeometry))
    ....

    =================

    他の方法でも良いのですが、任意の自由曲線内にあるshapeを検索するには
    どうしたらよいでしょうか?
    よろしくお願いいたします。

    2015年2月13日 4:09

回答

  • そもそも、各マウスイベントは発生していますか? Canvas等のパネル類では、子要素がその座標に存在しない、Backgroundもnull、といった場合マウスイベントを発生させませんが。対策としては、CanvasのBackgroundをTransparentにするのが考えられます。

    あとwktxtblockって何でしょうか。普通に考えれば、ここにはCanvasのインスタンスを渡して、HitTestResultCallbackでどの要素がヒットしたかを確認するものと思いますが。

    • 回答の候補に設定 星 睦美 2015年2月17日 4:30
    • 回答としてマーク Maru Masatoshi 2015年2月21日 0:46
    2015年2月13日 4:53

すべての返信

  • そもそも、各マウスイベントは発生していますか? Canvas等のパネル類では、子要素がその座標に存在しない、Backgroundもnull、といった場合マウスイベントを発生させませんが。対策としては、CanvasのBackgroundをTransparentにするのが考えられます。

    あとwktxtblockって何でしょうか。普通に考えれば、ここにはCanvasのインスタンスを渡して、HitTestResultCallbackでどの要素がヒットしたかを確認するものと思いますが。

    • 回答の候補に設定 星 睦美 2015年2月17日 4:30
    • 回答としてマーク Maru Masatoshi 2015年2月21日 0:46
    2015年2月13日 4:53
  • ありがとうございます。

    マウスイベントは発生していました。

    wktxtblockはcanvas内のTextBlockをループで指定したのですが、これが間違いだったようで
    ご指摘の通りmyCanvasを渡してやることでHITしました。

    VisualTreeHelper.HitTest(myCanvas, Nothing, New HitTestResultCallback(AddressOf MyHitTestResultCallback), New GeometryHitTestParameters(myPathGeometry))

    そしてHitTestResultCallbackの中で引数のHitTestResultの要素を判定したところやりたいことができました。

    ありがとうございました、またの機会がありましたらよろしくお願いいたします。

    2015年2月21日 0:51