2012-11-20 11 views
5

no'lu çocuğa ulaşamıyor. Bulama işlemini açıklayan birçok örnek buldum ancak Tünelleştirme ile ilgili hiçbir şey yok. Benim ana sorunum, yöneltilmiş olayı (WindowControl to UserControl) çocukta nasıl kaydedileceğini anlamam. aldım:RoutedEvent Tüneli,

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 kapsüllenmesi gereklidir, hiçbir sorun olmalı? Çocuk addView ile eklenir. Grid_MouseLeftButtonUp çağrıldı.
alıcı (orada pek böylece MVVM olan) aşağıdaki gibidir:

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> 

I lütfen bana bildirin şey unuttuysanız. Sorun, yönlendirilen olayın, UserControl_PreviewMouseLeftButtonUp

cevap

11

'a ulaşmamasıdır. Bu, tünel oluşturma yönlendirme stratejisinin nasıl çalıştığı değildir. Tünel oluşturma, olayın kökten başlayacağı ve ağaç yolundan arama kontrolüne geçeceği anlamına gelir. Mesela biz

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

sonra MyParent bir tünel olayı yükseltmek eğer aşağıdaki görsel ağaç varsa, tünel olayı ziyaret edecek:

  1. Pencere
  2. MyParent

ve NOT:

  1. MyParent
  2. ChildView

Yani özetlemek gerekirse, fokurdayan olaylar hep olay yükselterek kontrol başlayacak ve tünel olaylar görsel kökünde başlayacak olurken, görsel ağacının kökünde durdurmak ağacı ve olayı yükselterek kontrolü sonlandırın (aynı yol, sadece ters sıra).

EDIT: Yönlendirilen olaylar hakkında daha fazla bilgiyi MSDN's Routed Events Overview adresinde bulabilirsiniz. Anlamadığım

enter image description here

+0

: Aynı zamanda bu gösteren güzel bir imajı vardır. Neden programa MyParent'in root olduğunu söyleyemiyorum? – Martin

+1

Şimdi anlıyorum. Tünelleme çocuğuma ulaşamaz, bu da benim düşüncemde işe yaramıyor. O rıhtımları okudum ama bir şekilde bu şekilde anlamadım. Arayüzleri kullanarak problemimi çözeceğim ve sadece veriyi geçireceğim (plan B). Mükemmel açıklama için teşekkür ederim. – Martin

+1

Tünel açma işe yaramıyor, sadece denediğinden farklı bir görev için kullanılıyor. Örneğin, TextBox'ta belirli karakterleri tuş basışlarını yakalayarak ve olayları TextBox'a ulaşmadan iptal ederek izin vermemek için kullanılabilir. –

İlgili konular