2015-06-12 58 views
1

我使用VisualTreeHelper執行上的按鈕,看起來像這樣一個HitTest ...爲什麼VisualTreeHelper返回邊框按鈕

<Button Width="100" 
    Height="100" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center" 
    Background="Purple"> 
    Hello world 
</Button> 

然而,當我執行實際的HitTest這樣:

HitTestResult result = VisualTreeHelper.HitTest(_ContentHolder, new Point(xTransform, yTransform)); 
if (result != null) 
{    
} 

返回的對象看起來像這樣VisualHit = {System.Windows.Controls.Border}這對我來說不太合理。

任何人都可以請提供任何指導我可能會做錯什麼,我將如何返回實際的Button對象(這樣我可以觸發任何事件處理程序),爲什麼我可能會遇到這種行爲?

+0

問題:在Button上使用** Event Handler **會不會更容易? –

+0

絕對,但我試圖模仿鼠標功能而不需要征服實際的鼠標,所以據我瞭解這是我唯一的選擇。 –

+0

你住在什麼地獄? –

回答

1

如果您查看按鈕here的控件模板,則可以看到它幾乎完全由邊框控件組成。由於邊界是實際擊中的內容,這就是返回的內容。你應該使用一個通用的幫助函數來遍歷可視化樹來查找實際的按鈕。

public static T FindParent<T>(DependencyObject child) where T : DependencyObject 
{ 
    //get parent item 
    DependencyObject parentObject = VisualTreeHelper.GetParent(child); 

    //we've reached the end of the tree 
    if (parentObject == null) return null; 

    //check if the parent matches the type we're looking for 
    T parent = parentObject as T; 
    if (parent != null) 
     return parent; 
    else 
     return FindParent<T>(parentObject); 
} 

調用此函數,傳遞命中測試的結果並指定Button作爲類型應該返回被擊中的母按鈕。

現在...隨着所有的說法,你可能會想要你想要做錯的方式。沒有關於你在做什麼的更多細節,更重要的是爲什麼,可能很難指導你。

+0

絕對精彩,完全按照要求工作,並感謝* why *。我懷疑Button可能實際上是一個邊界,但不知道如何驗證。如上所述,我試圖模仿鼠標,而沒有實際指定鼠標來創建我自己的KinectRegion實現(如鏈接所述https://msdn.microsoft.com/en-us/library/microsoft.kinect.xaml .controls.kinectregion.aspx) - 真心感謝你的幫助... –

+0

我不認爲我曾經在WPF中寫過任何東西,至少沒有調用過這個函數。爲什麼它不是建在我身上的。 –

+0

是的,我只用了幾個月的時間和WPF一起從Windows Forms遷移過來,而且你的頭腦還是相當具有挑戰性的。不幸的是,WPF的大部分結構和功能並不總是顯而易見。再次感謝您的幫助,一旦它允許我將標記爲答案... –