Как выполнить тестирование XAML 3D-объекта в WPF

Что я хочу сделать, так это узнать, нажал ли пользователь красную кнопку моего джойстика. (для этой цели я рисую реальную графику джойстика, чтобы сделать наш рисунок закрытым)Наш 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
  • Я не могу получить доступ к x: названию трехмерного объекта
  • 3D-объект или нет FrameworkElement или Visual. Это Media3D

Как я это сделал, мне нужно только знать x:name, чтобы завершить мою реализацию... если у кого-то есть советы или другой способ, дайте мне знать.

Спасибо

РЕДАКТИРОВАТЬ: это свойства моего 3D-объекта:

2 ответа

Решение

Единственное, о чем я могу подумать, это сработает и будет дружественным к XAML - это определить собственное присоединенное свойство в GeometryModel3D. Посмотрите здесь, как создать пользовательские вложенные свойства.

Я знаю, что это старый пост, но он занимает высокое место в поисковом рейтинге, и я наткнулся на него, потому что я изучаю WPF 3D. Второй способ решить эту проблему - использовать Helix Toolkit. Они расширяют GeometryModel3D с помощью методов SetName() и GetName(). Таким образом, вы можете назвать это как-нибудь, а затем при выполнении лучевого теста вы можете получить имя:

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

Конечно, это означает добавление Helix Toolkit в смесь, но пока оно того стоило.

Другие вопросы по тегам