Procedura: aggiungere la gestione di classi per un evento indirizzato
Gli eventi indirizzati possono essere gestiti da gestori di classi o gestori di istanze in qualsiasi nodo specificato nella route. I gestori di classe vengono richiamati per primi e possono essere usati dalle implementazioni della classe per eliminare gli eventi dalla gestione delle istanze o introdurre altri comportamenti specifici degli eventi di proprietà delle classi di base. Questo esempio illustra due tecniche strettamente correlate per l'implementazione dei gestori di classi.
Esempio
Questo esempio usa una classe personalizzata basata sul Canvas pannello. Il presupposto di base dell'applicazione è che la classe personalizzata introduce comportamenti sui relativi elementi figlio, inclusa l'intercettazione di qualsiasi clic del pulsante sinistro del mouse e contrassegnarli gestiti, prima che venga richiamata la classe elemento figlio o qualsiasi gestore di istanza su di esso.
La UIElement classe espone un metodo virtuale che consente la gestione delle classi sull'evento PreviewMouseLeftButtonDown semplicemente eseguendo l'override dell'evento. Questo è il modo più semplice per implementare la gestione delle classi se tale metodo virtuale è disponibile in una posizione nella gerarchia della classe. Il codice seguente illustra l'implementazione OnPreviewMouseLeftButtonDown in "MyEditContainer" derivata da Canvas. L'implementazione contrassegna l'evento come gestito negli argomenti e quindi aggiunge codice per assegnare all'elemento di origine una modifica visibile di base.
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
Se non è disponibile alcuna classe virtuale nelle classi di base o per quel particolare metodo, la gestione delle classi può essere aggiunta direttamente usando un metodo di utilità della EventManager classe , RegisterClassHandler. Questo metodo deve essere chiamato solo all'interno dell'inizializzazione statica delle classi che aggiungono la gestione delle classi. In questo esempio viene aggiunto un altro gestore per PreviewMouseLeftButtonDown e in questo caso la classe registrata è la classe personalizzata. Al contrario, quando si usano le macchine virtuali, la classe registrata è effettivamente la UIElement classe base. Nei casi in cui le classi di base e le sottoclassi gestiscono ogni classe di registro, i gestori della sottoclasse vengono richiamati per primi. Il comportamento in un'applicazione sarebbe che prima questo gestore visualizzerebbe la relativa finestra di messaggio e quindi verrà visualizzata la modifica visiva nel gestore del metodo virtuale.
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
Vedi anche
.NET Desktop feedback