2012-11-20 5 views
5

터널링에 대해 설명하는 예제가 많이 있지만 터널링에 대한 설명은 터널링과 관련된 것입니다 (예 : 부모와 자식). 내 주요 문제는 내가 (UserControl WindowControl) 하위 라우트 된 이벤트를 등록하는 방법을 이해하지 않는다고 생각합니다. 내가 가진 :RoutedEvent 터널이 자식에 도달하지 않습니다

public partial class MyParent : UserControl 
{ 
    public static readonly RoutedEvent RoutedMouseUpEvent = EventManager.RegisterRoutedEvent(
     "PreviewMouseLeftButtonUp", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(WindowControl)); 

// Provide CLR accessors for the event   
public event RoutedEventHandler MouseUp 
{ 
    add { AddHandler(RoutedMouseUpEvent, value); } 
    remove { RemoveHandler(RoutedMouseUpEvent, value); } 
} 

public addView(UserControl view) 
{ 
WindowControl win = new WindowControl(); 
win.Content = view; 
} 

private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    RoutedEventArgs newEventArgs = new RoutedEventArgs(MyParent.RoutedMouseUpEvent); 
      RaiseEvent(newEventArgs); 
} 
} 

addView의 캡슐화가 필요가 아무 문제 없을 것? 자식은 addView를 통해 추가됩니다. Grid_MouseLeftButtonUp이 호출되었습니다.
수신기는 (많은이없는, 그래서 그것은 MVVM입니다) 다음과 같습니다

public partial class ChildView : UserControl 
{ 
void UserControl_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs args) 
{ 
    int i = 0; // The breakpoint is never called 
} 
} 

을 XAML

<Grid> 
    <Border BorderBrush="black" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" PreviewMouseLeftButtonUp="UserControl_PreviewMouseLeftButtonUp"> 
</Border> 
</Grid> 

에 내가 알려 주시기 바랍니다 뭔가를 잊어 버린 경우. 문제는 라우팅 된 이벤트가 UserControl_PreviewMouseLeftButtonUp에 도달하지 않는다는 것입니다.

답변

11

이것은 터널링 라우팅 전략의 작동 방식이 아닙니다. 터널링은 이벤트가 루트에서 시작하여 트리 컨트롤을 호출하는 트리 경로로 이동 함을 의미합니다. 예를 들어 우리가

Window 
| 
|--> SomeUserControl 
|--> MyParent 
    | 
    |--> ChildView 

다음 MyParent는 터널링 이벤트를 발생한다면 다음과 같은 시각적 트리가있는 경우, 터널링 이벤트는 방문 :

  1. MyParent

을 NOT

  1. MyParent
  2. ChildView

그래서 요약, 버블 링 이벤트는 항상 이벤트를 발생 제어에 시작하고 터널링 이벤트가 시각의 루트에 시작하면서, 시각적 트리의 루트에서 중지 트리를 만들고 이벤트를 올리는 컨트롤에서 끝내십시오 (정확한 경로, 역순 만).

편집 :MSDN's Routed Events Overview에서 라우트 된 이벤트에 대해 자세히 읽을 수 있습니다. 이해가 안

enter image description here

+0

: 그것은이를 보여주는 좋은 이미지를 가지고있다. 왜 MyParent가 루트라는 것을 프로그래머에게 알릴 수 없습니까? – Martin

+1

이제 알겠습니다. 터널 공사는 우리 아이에게 접근 할 수 없기 때문에 제 의견으로는 쓸모가 없습니다. 나는 그 부두를 읽었지만 어쨌든이 방법을 이해하지 못했습니다. 인터페이스를 사용하여 문제를 해결하고 단순히 데이터를 전달합니다 (이것은 계획 B였습니다). 훌륭한 설명에 감사드립니다. – Martin

+1

터널링은 쓸모가 없으며 단순히 시도하는 것과 다른 작업에 사용됩니다. 예를 들어, 키 누르기를 캡처하고 TextBox에 도달하기 전에 이벤트를 취소하여 TextBox의 특정 문자를 입력하지 못하게 할 수 있습니다. –

관련 문제