Evento enrutado de WPF, suscripción a eventos personalizados

Estoy tratando de hacer que los eventos enrutados funcionen con controles secundarios que activarán manualmente estos eventos y aparecerán y se manejarán en el nivel de la cuadrícula principal. Básicamente quiero hacer algo como esto:

<Grid Name="Root" WpfApplication5:SpecialEvent.Tap="Catcher_Tap">
    <Grid.RowDefinitions>
        <RowDefinition Height="40" />
        <RowDefinition Height="40" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <WpfApplication5:UserControl2 Grid.Row="0" x:Name="Catcher" />
    <WpfApplication5:UserControl1 Grid.Row="1" />
    <Frame Grid.Row="2" Source="Page1.xaml" />
</Grid>

Pero cuando ejecuto mi ejemplo, obtengo una referencia nula en el marco de presentación, la aplicación nunca se inicializa, falla cuando intenta cargar/inicializar el XAML (InitializeComponent()). Aquí está el pequeño archivo que contiene el evento:

public class SpecialEvent
{
    public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
        "Tap", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(UserControl1));

    // Provide CLR accessors for the event
    public event RoutedEventHandler Tap;
}

Básicamente, quiero copiar el comportamiento de cómo ButtonBase.Click permite a los padres suscribirse a cualquier método de clic de botón () para sus hijos. Pero, esto no parece funcionar para nada más que ButtonBase.Click(). Es decir, cuando cambio mi costumbre WpfApplication5:SpecialEvent.Tap="Catcher_Tap" a ButtonBase.Click="Catcher_Tap" funciona. ¿Alguna idea de por qué? ¿Qué está haciendo ButtonBase que yo no estoy haciendo?

preguntado el 27 de julio de 12 a las 17:07

2 Respuestas

Después de jugar un poco más, descubrí que es posible lograr lo que necesitaba en el código detrás de la ventana principal de esta manera:

public MainWindow()
    {
        InitializeComponent();
        Root.AddHandler(SpecialEvent.TapEvent, new RoutedEventHandler(Catcher_Tap));
    }

Por alguna razón, especificándolo en el XAML como lo haría con ButtonBase() no funciona, pero agregando el Handler en el código detrás sí.

Respondido 27 Jul 12, 19:07

El código que proporcionó registra un evento personalizado, sin embargo, no registra un adjunto evento personalizado. Tendrás que implementar explícitamente el Add*Handler y Remove*Handler métodos si desea utilizar la sintaxis adjunta con su evento. Consulte la sección "Definición de sus propios eventos adjuntos como eventos enrutados" en este artículo de MSDN.

Respondido 11 Oct 13, 03:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.