터널링에 대해 설명하는 예제가 많이 있지만 터널링에 대한 설명은 터널링과 관련된 것입니다 (예 : 부모와 자식). 내 주요 문제는 내가 (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에 도달하지 않는다는 것입니다.
: 그것은이를 보여주는 좋은 이미지를 가지고있다. 왜 MyParent가 루트라는 것을 프로그래머에게 알릴 수 없습니까? – Martin
이제 알겠습니다. 터널 공사는 우리 아이에게 접근 할 수 없기 때문에 제 의견으로는 쓸모가 없습니다. 나는 그 부두를 읽었지만 어쨌든이 방법을 이해하지 못했습니다. 인터페이스를 사용하여 문제를 해결하고 단순히 데이터를 전달합니다 (이것은 계획 B였습니다). 훌륭한 설명에 감사드립니다. – Martin
터널링은 쓸모가 없으며 단순히 시도하는 것과 다른 작업에 사용됩니다. 예를 들어, 키 누르기를 캡처하고 TextBox에 도달하기 전에 이벤트를 취소하여 TextBox의 특정 문자를 입력하지 못하게 할 수 있습니다. –