0

私がやりたいことは、ユーザーがジョイスティックの赤いボタンをクリックしたかどうかを知ることです。(目的のために、私は実際のジョイスティックのグラフィックを描画して、描画をプライベートに保ちます) XAML 3D ジョイスティック

このジョイスティックは XAML 3D です。

赤いボタンは GeometryModel3D オブジェクトで、x:Name は「Geo_Btn_CSS_TAKE」です。ジョイスティックをクリックすると、HitTest を実行できます。彼はすべての GeometryModel3D オブジェクトを提供してくれますが、x:Name にアクセスできないため、どれが適切なのかわかりません...

オブジェクトのビジュアル ツリー

そして、これが私の HitTest のやり方です:

private void OnTouchMouseDown(EventArgs e)
{
    Viewport3D viewport3D = WtoHitTest((Grid)Parent, e) as Viewport3D; // My own HitTest works well, I get my viewport3D

    Point mouseposition = WtoHelper.GetPositionFromEvent(e, viewport3D); // Get the point if it's a mouse event or touch event
    Point3D testpoint3D = new Point3D(mouseposition.X, mouseposition.Y, 0);
    Vector3D testdirection = new Vector3D(mouseposition.X, mouseposition.Y, 10);
    PointHitTestParameters pointparams = new PointHitTestParameters(mouseposition);
    RayHitTestParameters rayparams = new RayHitTestParameters(testpoint3D, testdirection);

    VisualTreeHelper.HitTest(viewport3D, null, HTResult, pointparams);
}

public HitTestResultBehavior HTResult(System.Windows.Media.HitTestResult rawresult)
{
    RayHitTestResult rayResult = rawresult as RayHitTestResult;

    if (rayResult != null)
    {
        RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;

        if (rayMeshResult != null)
        {
            GeometryModel3D hitgeo = rayMeshResult.ModelHit as GeometryModel3D;

            **// HERE I NEED TO KNOW WHAT IS MY GEOMETRYMODEL3D'S X:NAME**
            // ANY IDEA???
        }
    }
    return HitTestResultBehavior.Continue;
}

他に知っていること:

  • 私の 3D オブジェクトには、バインドできる位置 (x,y) がありません
  • Viewport3D に非 3D 要素を挿入できません
  • 3D オブジェクトの x:Name にアクセスできません
  • 3D オブジェクトか、FrameworkElement または Visual ではありません。彼らはMedia3Dです

私が行った方法では、実装を完了するために x:name を知るだけで済みます...誰かがヒントや他の方法を持っている場合は、お知らせください。

ありがとうございました

編集:これは私の 3D オブジェクトのプロパティです: ここに画像の説明を入力

4

2 に答える 2

1

私が考えることができることの 1 つは、GeometryModel3D で独自の添付プロパティを定義することです。カスタムの添付プロパティを作成する方法については、こちらを参照してください。

于 2012-05-01T19:16:22.840 に答える
0

これが古い投稿であることは知っていますが、検索ランキングで高く、WPF 3D を学んでいるので偶然見つけました。この問題を解決する 2 つ目の方法は、Helix Toolkit を使用することです。これらは、メソッド SetName() および GetName() を使用して GeometryModel3D を拡張します。したがって、それを何かと呼ぶことができ、レイテストを実行するときに名前を取得できます。

RayMeshGeometry3DHitTestResult rayHit = hr as RayMeshGeometry3DHitTestResult; //hr is of type HitTestResult
MessageBox.Show("Model found: " + rayHit.ModelHit.GetName());

もちろん、これは Helix Toolkit をミックスに追加することを意味しますが、これまでのところ、いくつかの点で価値がありました。

于 2016-03-23T21:01:03.463 に答える