2013-03-06 2 views
0

이것은 WPF 응용 프로그램입니다.LogicalTree 컨트롤을 마우스 오른쪽 아래로 클릭 VisualTree

나는 마우스 바로 아래에서 컨트롤을 얻으려고하고 있으며 놀라운 고통임을 입증합니다.

Mouse.DirectlyOver, InputHitTest 및 VisualTreeHelper.HitTest는 모두 VISUAL 트리를 참조합니다. 나는 통제 자체를 움켜 잡으려고한다.

예 : TextBox가 있고 위의 항목 중 하나를 사용하면 TextBox 자체를 원하지만 TextBoxView는 반환합니다.

이것은 PreviewLeftButtonDown 이벤트 내부에서 발생합니다. Sender는 항상 나를위한 ListViewItem이므로 Sender는 옵션이 아닙니다. e.OriginalSource를 체크하면 여전히 실제 컨트롤이 아닌 VisualTree 요소입니다.

필요하다면 더 자세히 설명해주십시오.

감사합니다.

답변

1

내가 유일한 방법은에 도착하는 것을 mdm20에 동의 Textbox에 의해 인 부모까지 횡단. 사실, 같은 대답으로 here is a link to the same question asked a couple of years ago. 불필요한 트리 순회를 제한하려면 ListViewItem을 누르기 만하면 검색을 중지 할 수 있습니다. 위의 항목은 어쨌든 찾고있는 것이 아닙니다.

그러나 마지막 링크와 this one together을 추가하면 실제로 내 답변에 이미 나와있는 것처럼 보입니다. TextBoxView이 반환되면 텍스트 상자가 히트되었음을 ​​알 수 있습니다. 잠재적으로 HitTestFilterCallBack을 통해 들어오는 들어오는 TextBox을 캐싱 할 수도 있지만, 그것은 이론과 버그가 발생할 가능성이 더 많습니다. 그러나 필터를 통과하는 이 (가) TextBoxView

+0

대답을 받아 들였습니다 TextBoxView는 내가 사용을 종료 한 것입니다 .TextBoxView는 실제로 어쨌든 내가 실제로 있었던 텍스트를 포함하고 있습니다. 사용자가 textBox 내에서 텍스트를 드래그하여 끌면 드래그를 트리거하려고합니다. 감사합니다. – tronious

4

원하는 유형을 찾을 때까지 비주얼 트리를 따라 가면됩니다. 다음은 코드에 link입니다. 여기

당신이 찾을 때까지

// walk up the visual tree to find object of type T, starting from initial object 
public static T FindUpVisualTree<T>(DependencyObject initial) where T : DependencyObject 
{ 
    DependencyObject current = initial; 

    while (current != null && current.GetType() != typeof(T)) 
    { 
     current = VisualTreeHelper.GetParent(current); 
    } 
    return current as T; 
} 
+0

의 부모인지 여부 만 확인하면됩니다. 답장을 보내 주셔서 감사합니다. 이 작업은 효과가 있지만 자주 발생하기 때문에 나무를 걷는 것을 좋아하지 않습니다. 또한 실수로 잘못된 TextBox를 치는 것에 대해 걱정할 것입니다. 컨트롤이 템플릿으로되어 있고 부모에게 이어지는 여러 텍스트 상자가있는 경우 어떻게 될까요? (=) 결국 JustinPihony의 대답이 내 필요를 충족시킵니다. – tronious

1

는 시각적 트리를 걸어 해당 링크에서 코드의 UIElement :

public UIElement FindUIElement(DependencyObject visualTreeNode) 
{ 
    UIElement elem; 
    while ((elem = (visualTreeNode as UIElement)) != null) 
     visualTreeNode = VisualTreeHelper.GetParent(visualTreeNode); 
    return elem; 
} 
관련 문제