2012-05-01 65 views
0

我想要做的是知道用戶是否單擊了我的遊戲杆的紅色按鈕。 (爲此目的,我繪製了真正的操縱桿圖形,以保持我們的繪圖隱私) Our XAML 3D joystick如何在WPF中使用HitTest XAML 3D對象

此操縱桿是XAML 3D。

紅色按鈕是一個GeometryModel3D對象,其中x:名稱爲「Geo_Btn_CSS_TAKE」。當我點擊操縱桿時,我可以做一個HitTest,他給我所有的GeometryModel3D對象,但是我不能訪問到x:Name,所以我不知道巫婆是不是一個好的...

Visual tree of my object

這是我做我的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元件:名稱的3D對象
  • 3D對象或不FrameworkElement的或Visual的。他們是Media3D

我這樣做的方式,我只需要知道x:name來完成我的實現...如果有人有一個提示或其他方式去,讓我知道。

謝謝

編輯:這是我的3D對象的屬性: enter image description here

+0

「rayparams」甚至在哪裏使用? – AgentFire

回答

1

的一兩件事,我能想到的,將工作和爲XAML友好是定義你自己的附加屬性GeometryModel3D。查看here瞭解如何創建自定義附加屬性。

+0

3D物件沒有標籤屬性。看到我剛剛添加的第3張照片 – mlemay

+0

我的不好,上面編輯過。 – Ani

+0

我沒有想到這一點,謝謝,AP運作良好 – mlemay

0

我知道這是一箇舊的帖子,但它在搜索排名高,我偶然發現,因爲我正在學習WPF 3D。解決問題的第二種方法是使用Helix工具包。他們使用方法SetName()和GetName()來擴展GeometryModel3D。所以,你可以做線測試時,把它的東西,然後你就可以得到名稱:

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

當然,這意味着將螺旋工具包混進去,但到目前爲止,它已經值得在幾個方面。