Nasıl yapılır: Gönderilmiş bir Olay için Sınıf İşleme Ekleme
Yönlendirilmiş olaylar, rotada verilen herhangi bir düğümdeki sınıf işleyicileri veya örnek işleyicileri tarafından işlenebilir. Sınıf işleyicileri ilk olarak çağrılır ve sınıf uygulamaları tarafından, örnek işlemenin olaylarını gizlemek veya temel sınıflara sahip olan olaylar üzerinde diğer olaya özgü davranışları tanıtmak için kullanılabilir. Bu örnek, sınıf işleyicilerini uygulamaya yönelik iki yakından ilgili tekniği göstermektedir.
Örnek
Bu örnek, paneli temel alan özel bir sınıf kullanır Canvas . Uygulamanın temel şirket içi, özel sınıfın, alt öğe sınıfı veya üzerindeki herhangi bir örnek işleyicilerinden önce, sol fare düğmesine tıklamasını ve bunları ele alır.
Sınıfı, olayı UIElementPreviewMouseLeftButtonDown geçersiz kılarak olay üzerinde sınıf işlemeye izin veren bir sanal yöntem gösterir. Bu, sınıf işlemeyi uygulamak için kullanabileceğiniz en basit yoldur. bu tür bir sanal yöntem, sınıfınızın hiyerarşisinde bir yerde kullanılabilir. Aşağıdaki kod, ' OnPreviewMouseLeftButtonDown den türetilmiş "MyEditContainer" içindeki uygulamayı gösterir Canvas . 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öntem için kullanılabilir bir sanal yoksa, sınıf işleme sınıfının bir yardımcı program yöntemi kullanılarak doğrudan eklenebilir EventManagerRegisterClassHandler . 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 başka bir işleyici ekler PreviewMouseLeftButtonDown ve bu durumda 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 biri sınıf işlemeyi kaydetmediği durumlarda, önce alt sınıf işleyicileri çağrılır. Bir uygulamadaki davranış ilk olarak bu işleyicinin ileti kutusunu göstermesi ve 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