Procedura: aggiungere la gestione di classi per un evento indirizzato

Aggiornamento: novembre 2007

È possibile gestire gli eventi indirizzati mediante gestori di classi o gestori di istanze su qualsiasi nodo specificato nella route. I gestori di classi vengono richiamati per primi e possono essere utilizzati dalle implementazioni di classi per sopprimere eventi dalla gestione di istanze o introdurre altri comportamenti specifici degli eventi su eventi di proprietà delle classi di base. In questo esempio vengono illustrate due tecniche strettamente correlate per l'implementazione di gestori di classi.

Esempio

In questo esempio viene utilizzata una classe personalizzata basata sul pannello Canvas. L'applicazione si basa sulla premessa che la classe personalizzata introduce i comportamenti sugli elementi figlio, incluse le operazioni di intercettazione dei clic del pulsante sinistro del mouse e di contrassegno di tali eventi come gestiti, prima che la classe dell'elemento figlio o qualsiasi gestore di istanze su di essa vengano richiamati.

La classe UIElement espone un metodo virtuale che attiva la gestione di classi sull'evento PreviewMouseLeftButtonDown, con il semplice override dell'evento. Si tratta della modalità più semplice per implementare la gestione di classi se tale metodo virtuale è disponibile nella gerarchia delle classi. Nel codice seguente viene illustrata l'implementazione di OnPreviewMouseLeftButtonDown in "MyEditContainer" derivato da Canvas. L'implementazione contrassegna l'evento come gestito negli argomenti, quindi aggiunge codice per apportare 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);
}

Se nessun metodo virtuale è disponibile sulle classi di base o per il metodo specifico, la gestione di classi può essere aggiunta utilizzando direttamente un metodo di utilità di EventManager, RegisterClassHandler. Questo metodo deve essere chiamato solo all'interno dell'inizializzazione statica delle classi che aggiungono la gestione di classi. In questo esempio viene aggiunto un altro gestore per PreviewMouseLeftButtonDown e in questo caso la classe registrata è la classe personalizzata. Al contrario, in caso di utilizzo di virtuali, la classe registrata è effettivamente la classe di base UIElement. Nei casi in cui la gestione di classi viene registrata dalle classi di base e dalla sottoclasse, i gestori della sottoclasse vengono richiamati per primi. Il comportamento in un'applicazione comporterebbe innanzitutto la visualizzazione della finestra di messaggio di questo gestore, quindi la visualizzazione della 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
}

Vedere anche

Attività

Procedura: gestire un evento indirizzato

Concetti

Contrassegno degli eventi indirizzati come gestiti e gestione delle classi

Cenni preliminari sugli eventi indirizzati

Riferimenti

EventManager