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