2015-06-12 1 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

Вопрос: Не было бы проще просто использовать ** Обработчик событий ** на кнопке? –

+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 не всегда очевидна. Еще раз спасибо за вашу помощь, отметим как ответ, как только это позволит мне ... –