Aracılığıyla paylaş


Nasıl yapılır: Gönderilmiş bir Olay için Sınıf İşleme Ekleme

Yönlendirilen olaylar, yoldaki belirli bir düğümde sınıf işleyicileri veya örnek işleyicileri tarafından işlenebilir. Sınıf işleyicileri önce çağrılır ve örnek işleme olaylarını engellemek veya temel sınıflara ait olaylar üzerinde olaya özgü diğer davranışları tanıtmak için sınıf uygulamaları tarafından kullanılabilir. Bu örnekte, sınıf işleyicilerini uygulamak için birbiriyle yakından ilişkili iki teknik gösterilmektedir.

Örnek

Bu örnekte panele dayalı Canvas özel bir sınıf kullanılır. Uygulamanın temel özelliği, alt öğe sınıfı veya üzerindeki örnek işleyicileri çağrılmadan önce, özel sınıfın sol fare düğmesi tıklamalarını kesme ve işlenmelerini işaretleme dahil olmak üzere alt öğelerinde davranışlar tanıtılmasıdır.

sınıfı, UIElement yalnızca olayı geçersiz kılarak olay üzerinde PreviewMouseLeftButtonDown sınıf işlemeyi etkinleştiren bir sanal yöntem sunar. Bu, sınıfınızın hiyerarşisinde bir yerde böyle bir sanal yöntem varsa sınıf işlemeyi uygulamanın en basit yoludur. Aşağıdaki kod, öğesinden Canvastüretilen "MyEditContainer" içindeki uygulamayı gösterirOnPreviewMouseLeftButtonDown. uygulama, olayı bağımsız değişkenlerde işlenmiş olarak işaretler ve ardından kaynak öğeye temel görünür bir değişiklik vermek için bazı kodlar ekler.

protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
    e.Handled = true; //suppress the click event and other leftmousebuttondown responders
    MyEditContainer ec = (MyEditContainer)e.Source;
    if (ec.EditState)
    { ec.EditState = false; }
    else
    { ec.EditState = true; }
    base.OnPreviewMouseRightButtonDown(e);
}
Protected Overrides Sub OnPreviewMouseRightButtonDown(ByVal e As System.Windows.Input.MouseButtonEventArgs)
    e.Handled = True 'suppress the click event and other leftmousebuttondown responders
    Dim ec As MyEditContainer = CType(e.Source, MyEditContainer)
    If ec.EditState Then
        ec.EditState = False
    Else
        ec.EditState = True
    End If
    MyBase.OnPreviewMouseRightButtonDown(e)
End Sub

Temel sınıflarda veya belirli bir yöntemde sanal yoksa, sınıf işleme doğrudan sınıfının RegisterClassHandlerbir yardımcı program yöntemi EventManager kullanılarak eklenebilir. Bu yöntem yalnızca sınıf işleme ekleyen sınıfların statik başlatması içinde çağrılmalıdır. Bu örnek için PreviewMouseLeftButtonDown başka bir işleyici ekler ve bu örnekte kayıtlı sınıf özel sınıftır. Buna karşılık, sanalları kullanırken, kayıtlı sınıf gerçekten UIElement temel sınıftır. Temel sınıfların ve alt sınıfların her yazmaç sınıfı işlemesi olduğu durumlarda, önce alt sınıf işleyicileri çağrılır. Bir uygulamadaki davranış, önce bu işleyicinin ileti kutusunu göstermesi ve ardından sanal yöntemin işleyicisindeki görsel değişikliğin gösterilmesi olacaktır.

static MyEditContainer()
{
  EventManager.RegisterClassHandler(typeof(MyEditContainer), PreviewMouseRightButtonDownEvent, new RoutedEventHandler(LocalOnMouseRightButtonDown));
}
internal static void LocalOnMouseRightButtonDown(object sender, RoutedEventArgs e)
{
  MessageBox.Show("this is invoked before the On* class handler on UIElement");
  //e.Handled = true; //uncommenting this would cause ONLY the subclass' class handler to respond
}
Shared Sub New()
    EventManager.RegisterClassHandler(GetType(MyEditContainer), PreviewMouseRightButtonDownEvent, New RoutedEventHandler(AddressOf LocalOnMouseRightButtonDown))
End Sub
Friend Shared Sub LocalOnMouseRightButtonDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    MessageBox.Show("this is invoked before the On* class handler on UIElement")
    'e.Handled = True //uncommenting this would cause ONLY the subclass' class handler to respond
End Sub

Ayrıca bkz.