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

我能想到的一件事会起作用并且对 XAML 友好,那就是在 GeometryModel3D 上定义您自己的附加属性。在此处查看如何创建自定义附加属性。

于 2012-05-01T19:16:22.840 回答
0

我知道这是一篇旧帖子,但它的搜索排名很高,我偶然发现了它,因为我正在学习 WPF 3D。解决问题的第二种方法是使用 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 回答