Marcar eventos enrutados como controlados y control de clasesMarking Routed Events as Handled, and Class Handling

Los controladores de un evento enrutado pueden marcar el evento como controlado en los datos del evento.Handlers for a routed event can mark the event handled within the event data. Controlar el evento acorta de forma efectiva la ruta.Handling the event will effectively shorten the route. El control de clases es un concepto de programación que admiten los eventos enrutados.Class handling is a programming concept that is supported by routed events. Un controlador de clases tiene la oportunidad de controlar un evento enrutado determinado en un nivel de clase con un controlador que se invoca antes que cualquier controlador de instancias de cualquier instancia de la clase.A class handler has the opportunity to handle a particular routed event at a class level with a handler that is invoked before any instance handler on any instance of the class.

Requisitos previosPrerequisites

En este tema se profundiza sobre los conceptos presentados en Información general sobre eventos enrutados.This topic elaborates on concepts introduced in the Routed Events Overview.

Cuándo se deben marcar los eventos como controladosWhen to Mark Events as Handled

Al establecer el valor de la Handled true propiedad en en los datos de evento de un evento enrutado, esto se conoce como "marcar el evento como controlado".When you set the value of the Handled property to true in the event data for a routed event, this is referred to as "marking the event handled". No hay ninguna regla absoluta sobre cuándo se deben marcar los eventos enrutados como controlados como autor de una aplicación o como autor de control que responde a eventos enrutados existentes o implementa nuevos eventos enrutados.There is no absolute rule for when you should mark routed events as handled, either as an application author, or as a control author who responds to existing routed events or implements new routed events. En su mayor parte, el concepto de "controlado" que se lleva a cabo en los datos de eventos del evento enrutado debe usarse como protocolo limitado para las respuestas de su propia aplicación a los diversos WPFWPF eventos enrutados que se exponen en las API, así como para cualquier evento enrutado personalizado.For the most part, the concept of "handled" as carried in the routed event's event data should be used as a limited protocol for your own application's responses to the various routed events exposed in WPFWPF APIs as well as for any custom routed events. Otra forma de considerar la cuestión del "control" es que, generalmente, debería marcar un evento enrutado como controlado si el código respondió al evento enrutado de manera significativa y relativamente completa.Another way to consider the "handled" issue is that you should generally mark a routed event handled if your code responded to the routed event in a significant and relatively complete way. Normalmente, no debería haber más de una respuesta significativa que requiera implementaciones del controlador independientes para cualquier instancia de evento enrutado.Typically, there should not be more than one significant response that requires separate handler implementations for any single routed event occurrence. Si se necesitan más respuestas, se debe implementar el código necesario a través de la lógica de la aplicación encadenada con un único controlador, en lugar de usar el sistema de eventos enrutados para el reenvío.If more responses are needed, then the necessary code should be implemented through application logic that is chained within a single handler rather than by using the routed event system for forwarding. El concepto de "significativo" también es subjetivo y depende de la aplicación o el código.The concept of what is "significant" is also subjective, and depends on your application or code. Como guía general, estos son algunos ejemplos de "respuesta significativa": establecer el foco, modificar el estado público, establecer propiedades que afectan a la representación visual y generar otros eventos nuevos.As general guidance, some "significant response" examples include: setting focus, modifying public state, setting properties that affect the visual representation, and raising other new events. Ejemplos de respuestas no significativas: modificar el estado privado (sin impacto visual ni representación de programación), registrar eventos o examinar los argumentos de un evento y decidir no responder a él.Examples of nonsignificant responses include: modifying private state (with no visual impact, or programmatic representation), logging of events, or looking at arguments of an event and choosing not to respond to it.

El comportamiento del sistema de eventos enrutados refuerza este modelo de "respuesta significativa" para usar el estado controlado de un evento enrutado XAMLXAML , ya que los controladores AddHandler agregados en o la firma común de no se invocan en respuesta a un evento enrutado donde el evento los datos ya están marcados como controlados.The routed event system behavior reinforces this "significant response" model for using handled state of a routed event, because handlers added in XAMLXAML or the common signature of AddHandler are not invoked in response to a routed event where the event data is already marked handled. Debe realizar el esfuerzo adicional de agregar un controlador con la versión del handledEventsToo parámetro (AddHandler(RoutedEvent, Delegate, Boolean)) para controlar los eventos enrutados marcados por participantes anteriores en la ruta del evento.You must go through the extra effort of adding a handler with the handledEventsToo parameter version (AddHandler(RoutedEvent, Delegate, Boolean)) in order to handle routed events that are marked handled by earlier participants in the event route.

En algunas circunstancias, los propios controles marcan ciertos eventos enrutados como controlados.In some circumstances, controls themselves mark certain routed events as handled. Un evento enrutado controlado representa una decisión de los autores de control de WPFWPF por la que las acciones del control de respuesta al evento enrutado son significativas o completas como parte de la implementación del control, y el evento no necesita ningún otro control.A handled routed event represents a decision by WPFWPF control authors that the control's actions in response to the routed event are significant or complete as part of the control implementation, and the event needs no further handling. Normalmente, para hacerlo, se agrega un controlador de clase para un evento o se reemplaza uno de los elementos virtuales de controlador de clase que existen en una clase base.Usually this is done by adding a class handler for an event, or by overriding one of the class handler virtuals that exist on a base class. Si es necesario, puede resolver el control de eventos. Consulte Solución de la supresión de eventos mediante controles más adelante en este tema.You can still work around this event handling if necessary; see Working Around Event Suppression by Controls later in this topic.

Comparación de eventos de "vista previa" (tunelización) y de propagación, y control de eventos"Preview" (Tunneling) Events vs. Bubbling Events, and Event Handling

Los eventos enrutados de vista previa son eventos que siguen una ruta de tunelización a través del árbol de elementos.Preview routed events are events that follow a tunneling route through the element tree. "Preview", expresado en la convención de nomenclatura, indica el principio general para los eventos de entrada que establece que los eventos enrutados de vista previa (tunelización) se generan antes que el evento enrutado de propagación equivalente.The "Preview" expressed in the naming convention is indicative of the general principle for input events that preview (tunneling) routed events are raised prior to the equivalent bubbling routed event. Además, los eventos enrutados de entrada que tienen un par de tunelización y propagación tienen una lógica de control distinta.Also, input routed events that have a tunneling and bubbling pair have a distinct handling logic. Si un agente de escucha de eventos marca el evento enrutado de tunelización/vista previa, el evento enrutado de propagación se marcará como controlado incluso antes de que cualquier agente de escucha de evento enrutado de propagación lo reciba.If the tunneling/preview routed event is marked as handled by an event listener, then the bubbling routed event will be marked handled even before any listeners of the bubbling routed event receive it. Los eventos enrutados de tunelización y propagación son, técnicamente, eventos independientes, pero comparten deliberadamente la misma instancia de datos de evento para habilitar este comportamiento.The tunneling and bubbling routed events are technically separate events, but they deliberately share the same instance of event data to enable this behavior.

La conexión entre los eventos enrutados de tunelización y propagación se realiza mediante la implementación interna de cómo cualquier clase de WPFWPF determinada genera sus propios eventos enrutados declarados, y este es el caso de los eventos enrutados de entrada emparejados.The connection between the tunneling and bubbling routed events is accomplished by the internal implementation of how any given WPFWPF class raises its own declared routed events, and this is true of the paired input routed events. Sin embargo, a menos que exista esta implementación de nivel de clase, no hay ninguna conexión entre un evento enrutado de tunelización y uno de propagación que comparten el esquema de nomenclatura: sin tal implementación, serían dos eventos enrutados completamente independientes y no se generarían en secuencia ni compartirían datos de evento.But unless this class-level implementation exists, there is no connection between a tunneling routed event and a bubbling routed event that share the naming scheme: without such implementation they would be two entirely separate routed events and would not be raised in sequence or share event data.

Para obtener más información sobre cómo implementar pares de eventos enrutados de entrada de tunelización y propagación en una clase personalizada, consulte Cómo: Crear un evento enrutado personalizado.For more information about how to implement tunnel/bubble input routed event pairs in a custom class, see Create a Custom Routed Event.

Controladores de clases y controladores de instanciasClass Handlers and Instance Handlers

Los eventos enrutados consideran dos tipos distintos de agentes de escucha para el evento: de clase y de instancia.Routed events consider two different types of listeners to the event: class listeners and instance listeners. Los agentes de escucha de clase existen porque los tipos EventManager han llamadoRegisterClassHandlera una API determinada,, en su constructor estático, o han invalidado un método virtual de controlador de clase de una clase base de elemento.Class listeners exist because types have called a particular EventManager API ,RegisterClassHandler, in their static constructor, or have overridden a class handler virtual method from an element base class. Los agentes de escucha de instancia son instancias de clase o elementos concretos en los que se han adjuntado uno o varios controladores para ese AddHandlerevento enrutado mediante una llamada a.Instance listeners are particular class instances/elements where one or more handlers have been attached for that routed event by a call to AddHandler. Los WPFWPF eventos enrutados existentes realizan AddHandler llamadas a como parte del contenedor de eventos de Common Language Runtime (CLR){} para agregar{} y quitar implementaciones del evento, que es también XAMLXAML el mecanismo sencillo de se habilita la Asociación de controladores de eventos a través de una sintaxis de atributo.Existing WPFWPF routed events make calls to AddHandler as part of the common language runtime (CLR) event wrapper add{} and remove{} implementations of the event, which is also how the simple XAMLXAML mechanism of attaching event handlers via an attribute syntax is enabled. Por lo tanto, XAMLXAML incluso el uso simple equivale en última AddHandler instancia a una llamada.Therefore even the simple XAMLXAML usage ultimately equates to an AddHandler call.

Se comprueban las implementaciones de controlador registradas de los elementos del árbol visual.Elements within the visual tree are checked for registered handler implementations. Los controladores se pueden invocar a lo largo de la ruta en el orden inherente al tipo de la estrategia de enrutamiento para el evento enrutado.Handlers are potentially invoked throughout the route, in the order that is inherent in the type of the routing strategy for that routed event. Por ejemplo, los eventos enrutados de propagación invocan primero los controladores adjuntos al mismo elemento que generó el evento enrutado.For instance, bubbling routed events will first invoke those handlers that are attached to the same element that raised the routed event. A continuación, el evento enrutado "se propaga" en el siguiente elemento primario y así sucesivamente hasta que se alcanza el elemento raíz de aplicación.Then the routed event "bubbles" to the next parent element and so on until the application root element is reached.

Desde la perspectiva del elemento raíz en una ruta de propagación, si el control de clases o cualquier elemento más cercano al origen del evento enrutado invoca controladores que marcan los argumentos de evento como controlados, no se invocan controladores en los elementos raíz y la ruta del evento se acorta eficazmente antes de llegar al elemento raíz.From the perspective of the root element in a bubbling route, if class handling or any element closer to the source of the routed event invoke handlers that mark the event arguments as being handled, then handlers on the root elements are not invoked, and the event route is effectively shortened before reaching that root element. Sin embargo, la ruta no se detiene por completo, ya que se pueden agregar controladores mediante la condición especial de que se deben invocar igualmente, incluso si un controlador de clase o de instancia ha marcado el evento enrutado como controlado.However, the route is not completely halted, because handlers can be added using a special conditional that they should still be invoked, even if a class handler or instance handler has marked the routed event as handled. Esto se explica en Adición de controladores de instancias que se generan incluso cuando los eventos se marcan como controlados, más adelante en este tema.This is explained in Adding Instance Handlers That Are Raised Even When Events Are Marked Handled, later in this topic.

En un nivel más profundo que la ruta del evento, también puede haber varios controladores de clases que actúen en cualquier instancia de una clase.At a deeper level than the event route, there are also potentially multiple class handlers acting on any given instance of a class. Esto se debe a que el modelo de control de clase para los eventos enrutados permite que todas las clases posibles de una jerarquía de clases registren su propio controlador de clase para cada evento enrutado.This is because the class handling model for routed events enables all possible classes in a class hierarchy to each register its own class handler for each routed event. Cada controlador de clase se agrega a un almacén interno y, cuando se construye la ruta de eventos para una aplicación, todos los controladores de clase se agregan a la ruta del evento.Each class handler is added to an internal store, and when the event route for an application is constructed, the class handlers are all added to the event route. Los controladores de clase se agregan a la ruta de modo que el controlador de la clase más derivada se invoca primero y los controladores de clase de cada clase base sucesiva se invocan después.Class handlers are added to the route such that the most-derived class handler is invoked first, and class handlers from each successive base class are invoked next. Por lo general, los controladores de clase no están registrados por lo que también responden a eventos enrutados que ya se marcaron como controlados.Generally, class handlers are not registered such that they also respond to routed events that were already marked handled. Por consiguiente, este mecanismo de control de clases habilita una de dos opciones:Therefore, this class handling mechanism enables one of two choices:

  • Las clases derivadas pueden complementar el control de clases que se hereda de la clase base agregando un controlador que no marca el evento enrutado como controlado, porque el controlador de la clase base se invocará después del controlador de la clase derivada.Derived classes can supplement the class handling that is inherited from the base class by adding a handler that does not mark the routed event handled, because the base class handler will be invoked sometime after the derived class handler.

  • Las clases derivadas pueden reemplazar el control de clases de la clase base agregando un controlador de clase que marque el evento enrutado como controlado.Derived classes can replace the class handling from the base class by adding a class handler that marks the routed event handled. Debe tener cuidado con este enfoque, porque es posible que cambie el diseño del control de base deseado en áreas como el aspecto visual, la lógica de estado, el control de entrada y la gestión de comandos.You should be cautious with this approach, because it will potentially change the intended base control design in areas such as visual appearance, state logic, input handling, and command handling.

Control de clases de eventos enrutados mediante clases base de controlClass Handling of Routed Events by Control Base Classes

En cada nodo de elemento dado de una ruta de eventos, los agentes de escucha de clase tienen la oportunidad de responder al evento enrutado antes que cualquier agente de escucha de instancia en el elemento.On each given element node in an event route, class listeners have the opportunity to respond to the routed event before any instance listener on the element can. Por este motivo, los controladores de clase se usan a veces para suprimir eventos enrutados que una implementación de clase de control determinada no quiere que se propaguen más o para proporcionar un control especial de ese evento enrutado que es una característica de la clase.For this reason, class handlers are sometimes used to suppress routed events that a particular control class implementation does not wish to propagate further, or to provide special handling of that routed event that is a feature of the class. Por ejemplo, una clase podría generar su propio evento específico de clase con información más específica sobre el significado de alguna condición de entrada de usuario en el contexto de esa clase en particular.For instance, a class might raise its own class-specific event that contains more specifics about what some user input condition means in the context of that particular class. La implementación de la clase, a continuación, puede marcar el evento enrutado más general como controlado.The class implementation might then mark the more general routed event as handled. Normalmente, los controladores de clase se agregan de modo que no se invocan para los eventos enrutados en los que los datos de eventos compartidos ya estaban RegisterClassHandler(Type, RoutedEvent, Delegate, Boolean) marcados como controlados, pero para los casos atípicos también hay una firma que registra los controladores de clase que se deben invocar incluso cuando los eventos enrutados son marcado como controlado.Class handlers are typically added such that they are not invoked for routed events where shared event data was already marked handled, but for atypical cases there is also a RegisterClassHandler(Type, RoutedEvent, Delegate, Boolean) signature that registers class handlers to invoke even when routed events are marked handled.

Elementos virtuales de controlador de claseClass Handler Virtuals

Algunos elementos, especialmente los elementos base como UIElement, exponen los métodos virtuales "on * Event" vacíos y "Preview*Event" que corresponden a su lista de eventos enrutados públicos.Some elements, particularly the base elements such as UIElement, expose empty "On*Event" and "OnPreview*Event" virtual methods that correspond to their list of public routed events. Estos métodos virtuales se pueden invalidar para implementar un controlador de clase para el evento enrutado.These virtual methods can be overridden to implement a class handler for that routed event. Las clases de elementos base registran estos métodos virtuales como su controlador de clase para cada evento enrutado con RegisterClassHandler(Type, RoutedEvent, Delegate, Boolean) tal y como se ha descrito anteriormente.The base element classes register these virtual methods as their class handler for each such routed event using RegisterClassHandler(Type, RoutedEvent, Delegate, Boolean) as described earlier. Los métodos virtuales On*Event facilitan la implementación del control de clases para los eventos enrutados pertinentes, sin necesidad de una inicialización especial en constructores estáticos para cada tipo.The On*Event virtual methods make it much simpler to implement class handling for the relevant routed events, without requiring special initialization in static constructors for each type. Por ejemplo, puede Agregar control de clases para el DragEnter evento en cualquier UIElement clase derivada invalidando el OnDragEnter método virtual.For instance, you can add class handling for the DragEnter event in any UIElement derived class by overriding the OnDragEnter virtual method. Dentro de la invalidación, podría controlar el evento enrutado, generar otros eventos, iniciar una lógica específica de clase que podría cambiar las propiedades de elemento en instancias, o cualquier combinación de esas acciones.Within the override, you could handle the routed event, raise other events, initiate class-specific logic that might change element properties on instances, or any combination of those actions. Por lo general, debe llamar a la implementación base en dichas invalidaciones incluso si marca el evento como controlado.You should generally call the base implementation in such overrides even if you mark the event handled. Se recomienda llamar a la implementación base porque el método virtual se encuentra en la clase base.Calling the base implementation is strongly recommended because the virtual method is on the base class. El patrón virtual protegido estándar de llamar a las implementaciones base desde cada elemento virtual, básicamente, reemplaza y es comparable a un mecanismo similar que es nativo al control de clases de eventos enrutados, mediante el cual se llama a los controladores de clase de todas las clases de una jerarquía de clases en una instancia determinada, comenzando por el controlador de la clase más derivada y continuando hasta el controlador de la clase base.The standard protected virtual pattern of calling the base implementations from each virtual essentially replaces and parallels a similar mechanism that is native to routed event class handling, whereby class handlers for all classes in a class hierarchy are called on any given instance, starting with the most-derived class' handler and continuing to the base class handler. Solo se debe omitir la llamada de implementación base si la clase tiene un requisito deliberado para cambiar la lógica de control de clase base.You should only omit the base implementation call if your class has a deliberate requirement to change the base class handling logic. Si se llama a la implementación base antes o después, el código de invalidación dependerá de la naturaleza de la implementación.Whether you call the base implementation before or after your overriding code will depend on the nature of your implementation.

Control de clase de evento de entradaInput Event Class Handling

Los métodos virtuales de controlador de clase se registran de modo que solo se invocan en casos donde ya no se marcan los datos de evento compartidos como controlados.The class handler virtual methods are all registered such that they are only invoked in cases where any shared event data are not already marked handled. Además, solo para los eventos de entrada, las versiones de tunelización y propagación, normalmente, se producen en secuencia y comparten datos de eventos.Also, for the input events uniquely, the tunneling and bubbling versions typically are raised in sequence and share event data. Esto supone que, para un par determinado de controladores de clase de eventos de entrada, donde uno es la versión de tunelización y el otro, la de propagación, no es recomendable marcar el evento como controlado inmediatamente.This entails that for a given pair of class handlers of input events where one is the tunneling version and the other is the bubbling version, you may not want to mark the event handled immediately. Si implementa el método virtual de control de clase de tunelización para marcar el evento como controlado, el controlador de clase de propagación no se podrá invocar (además de impedir que se invoque cualquier controlador de instancias registrado normalmente para el evento de tunelización o propagación).If you implement the tunneling class handling virtual method to mark the event handled, that will prevent the bubbling class handler from being invoked (as well as preventing any normally registered instance handlers for either the tunneling or bubbling event from being invoked).

Una vez completado el control de clases en un nodo, se consideran los agentes de escucha de instancia.Once class handling on a node is complete, the instance listeners are considered.

Adición de controladores de instancias que se generan incluso cuando los eventos se marcan como controladosAdding Instance Handlers That Are Raised Even When Events Are Marked Handled

El AddHandler método proporciona una sobrecarga determinada que le permite agregar controladores que el sistema de eventos invocará cada vez que un evento alcance el elemento de control de la ruta, aunque algún otro controlador ya haya ajustado los datos de evento para marcarlos. evento como controlado.The AddHandler method supplies a particular overload that allows you to add handlers that will be invoked by the event system whenever an event reaches the handling element in the route, even if some other handler has already adjusted the event data to mark that event as handled. Normalmente, esto no se hace.This is not typically done. Por lo general, se pueden escribir controladores para ajustar todas las áreas del código de aplicación que podrían verse afectadas por un evento, independientemente de dónde se controlara en un árbol de elementos, incluso si se quieren varios resultados finales.Generally, handlers can be written to adjust all areas of application code that might be influenced by an event, regardless of where it was handled in an element tree, even if multiple end results are desired. Además, normalmente, solo hay un elemento que necesite responder a ese evento y la lógica de aplicación adecuada ya se ha ejecutado.Also, typically there is really only one element that needs to respond to that event, and the appropriate application logic had already happened. Pero la sobrecarga handledEventsToo está disponible para los casos excepcionales en que otro elemento de una composición de control o árbol de elementos ya se ha marcado como controlado, pero otros elementos superiores o inferiores del árbol de elementos (dependiendo de la ruta) aún quieren tener sus propios controladores invocados.But the handledEventsToo overload is available for the exceptional cases where some other element in an element tree or control compositing has already marked an event as handled, but other elements either higher or lower in the element tree (depending on route) still wish to have their own handlers invoked.

Cuándo se deben marcar los eventos controlados como no controladosWhen to Mark Handled Events as Unhandled

Por lo general, los eventos enrutados marcados como controlados no deben marcarseHandled como no controlados false(volver a establecerse en) incluso handledEventsToopor los controladores que actúan sobre.Generally, routed events that are marked handled should not be marked unhandled (Handled set back to false) even by handlers that act on handledEventsToo. Sin embargo, algunos eventos de entrada tienen representaciones de eventos de alto nivel y de nivel inferior que pueden superponerse cuando el evento de alto nivel se ve en una posición en el árbol y el evento de bajo nivel en otra posición.However, some input events have high-level and lower-level event representations that can overlap when the high-level event is seen at one position in the tree and the low-level event at another position. Por ejemplo, considere el caso en el que un elemento secundario escucha un evento de clave de alto nivel, TextInput como mientras un elemento primario escucha a un evento KeyDownde bajo nivel como.For instance, consider the case where a child element listens to a high-level key event such as TextInput while a parent element listens to a low-level event such as KeyDown. Si el elemento primario controla el evento de bajo nivel, el evento de nivel superior se puede suprimir incluso en el elemento secundario que, intuitivamente, debería tener la primera oportunidad de controlar el evento.If the parent element handles the low-level event, the higher-level event can be suppressed even in the child element that intuitively should have first opportunity to handle the event.

En estas situaciones, puede ser necesario agregar controladores a los elementos primarios y secundarios para el evento de bajo nivel.In these situations it may be necessary to add handlers to both parent elements and child elements for the low-level event. La implementación del controlador del elemento secundario puede marcar el evento de bajo nivel como controlado, pero la implementación del controlador del elemento primario lo marcaría de nuevo como no controlado para que los elementos superiores del árbol (así como el evento de alto nivel) puedan tener la oportunidad de responder.The child element handler implementation can mark the low-level event as handled, but the parent element handler implementation would set it unhandled again so that further elements up the tree (as well as the high-level event) can have the opportunity to respond. Esta situación debería ser poco frecuente.This situation is should be fairly rare.

Supresión deliberada de eventos de entrada para la composición de controlDeliberately Suppressing Input Events for Control Compositing

El escenario principal donde se utiliza el control de clases de eventos enrutados es para los eventos de entrada y los controles compuestos.The main scenario where class handling of routed events is used is for input events and composited controls. Un control compuesto está, por definición, compuesto por varios controles prácticos o clases base de control.A composited control is by definition composed of multiple practical controls or control base classes. A menudo, el autor del control quiere amalgamar todos los posibles eventos de entrada que cada uno de los subcomponentes pueda generar a fin de notificar todo el control como el origen del evento singular.Often the author of the control wishes to amalgamate all of the possible input events that each of the subcomponents might raise, in order to report the entire control as the singular event source. En algunos casos, puede que el autor del control quiera suprimir los eventos de los componentes por completo o sustituir un evento definido por el componente que lleva más información o implica un comportamiento más concreto.In some cases the control author might wish to suppress the events from components entirely, or substitute a component-defined event that carries more information or implies a more specific behavior. El ejemplo canónico que es visible inmediatamente para cualquier autor de componentes es cómo Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) controla un Button evento del mouse que finalmente se resolverá en el evento intuitivo que tienen todos los Click botones: un evento.The canonical example that is immediately visible to any component author is how a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Button handles any mouse event that will eventually resolve to the intuitive event that all buttons have: a Click event.

La Button clase base (ButtonBase) deriva a partir Control de la cual a su vez FrameworkElement se UIElementderiva de y, y gran parte de la infraestructura de eventos necesaria para el procesamiento UIElement de entradas de controles está disponible en el nivel.The Button base class (ButtonBase) derives from Control which in turn derives from FrameworkElement and UIElement, and much of the event infrastructure needed for control input processing is available at the UIElement level. En concreto, UIElement procesa eventos Mouse generales que controlan la prueba de posicionamiento del cursor del mouse dentro de sus límites y proporciona distintos eventos para las acciones de MouseLeftButtonDownbotón más comunes, como.In particular, UIElement processes general Mouse events that handle hit testing for the mouse cursor within its bounds, and provides distinct events for the most common button actions, such as MouseLeftButtonDown. UIElementtambién proporciona una virtual OnMouseLeftButtonDown vacía como el controlador de clase registrado previamente para MouseLeftButtonDowny ButtonBase la reemplaza.UIElement also provides an empty virtual OnMouseLeftButtonDown as the preregistered class handler for MouseLeftButtonDown, and ButtonBase overrides it. Del mismo ButtonBase modo, usa controladores de MouseLeftButtonUpclase para.Similarly, ButtonBase uses class handlers for MouseLeftButtonUp. En las invalidaciones, que se pasan RoutedEventArgs Handled a los datos del evento, las implementaciones marcan esa instancia como administrada estableciendo en true, y esos mismos datos de evento son los que continúan a lo largo del resto de la ruta a otros controladores de clases y también para los controladores de instancia o los establecedores de eventos.In the overrides, which are passed the event data, the implementations mark that RoutedEventArgs instance as handled by setting Handled to true, and that same event data is what continues along the remainder of the route to other class handlers and also to instance handlers or event setters. Además, la OnMouseLeftButtonUp invalidación generará el Click evento.Also, the OnMouseLeftButtonUp override will next raise the Click event. El resultado final de la mayoría de los agentes de escucha MouseLeftButtonDown será MouseLeftButtonUp que los eventos y "desaparezcan" y Clickse reemplacen en su lugar por, un evento que tenga más significado porque se sabe que este evento se originó en un botón verdadero y no en algunos parte compuesta del botón o de otro elemento completo.The end result for most listeners will be that the MouseLeftButtonDown and MouseLeftButtonUp events "disappear" and are replaced instead by Click, an event that holds more meaning because it is known that this event originated from a true button and not some composite piece of the button or from some other element entirely.

Solución de la supresión de eventos mediante controlesWorking Around Event Suppression by Controls

A veces, este comportamiento de supresión de eventos en controles individuales puede interferir con algunas intenciones más generales de la lógica de control de eventos de la aplicación.Sometimes this event suppression behavior within individual controls can interfere with some more general intentions of event handling logic for your application. Por ejemplo, si, por alguna razón, la aplicación tuviera un MouseLeftButtonDown controlador para ubicarse en el elemento raíz de la aplicación, observará que cualquier clic del mouse en MouseLeftButtonDown un MouseLeftButtonUp botón no invocaría ni controladores en el nivel raíz.For instance, if for some reason your application had a handler for MouseLeftButtonDown located at the application root element, you would notice that any mouse click on a button would not invoke MouseLeftButtonDown or MouseLeftButtonUp handlers at the root level. En realidad, el evento en sí se propagó hacia arriba (de nuevo, las rutas de evento no están finalizadas realmente, pero el sistema de eventos enrutados cambia su comportamiento de invocación de controlador después de marcarse como controlado).The event itself actually did bubble up (again, event routes are not truly ended, but the routed event system changes their handler invocation behavior after being marked handled). Cuando el evento enrutado alcanza el botón, ButtonBase el control de clase MouseLeftButtonDown marcó el control controlado porque deseaba Click sustituir el evento por un significado más.When the routed event reached the button, the ButtonBase class handling marked the MouseLeftButtonDown handled because it wished to substitute the Click event with more meaning. Por lo tanto, MouseLeftButtonDown no se invocará ningún controlador estándar más allá de la ruta.Therefore, any standard MouseLeftButtonDown handler further up the route would not be invoked. Hay dos técnicas que puede usar para asegurarse de que los controladores se invoquen en estas circunstancias.There are two techniques you can use to ensure that your handlers would be invoked in this circumstance.

La primera técnica consiste en agregar deliberadamente el controlador mediante handledEventsToo la firma AddHandler(RoutedEvent, Delegate, Boolean)de.The first technique is to deliberately add the handler using the handledEventsToo signature of AddHandler(RoutedEvent, Delegate, Boolean). Una limitación de este enfoque es que esta técnica para adjuntar un controlador de eventos solo es posible desde el código, no desde el marcado.A limitation of this approach is that this technique for attaching an event handler is only possible from code, not from markup. La sintaxis simple de especificar el nombre del controlador de eventos como un valor de atributo de evento a través de Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) no permite ese comportamiento.The simple syntax of specifying the event handler name as an event attribute value via Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) does not enable that behavior.

La segunda técnica solo funciona para los eventos de entrada, donde se emparejan las versiones de tunelización y propagación del evento enrutado.The second technique works only for input events, where the tunneling and bubbling versions of the routed event are paired. Para estos eventos enrutados, también puede agregar controladores al evento enrutado equivalente de tunelización/vista previa.For these routed events, you can add handlers to the preview/tunneling equivalent routed event instead. El evento enrutado se tunelizará por la ruta partiendo de la raíz, por lo que el código de control de clase del botón no lo interceptaría, siempre que haya adjuntado el controlador Preview en algún nivel de elemento antecesor en el árbol de elementos de la aplicación.That routed event will tunnel through the route starting from the root, so the button class handling code would not intercept it, presuming that you attached the Preview handler at some ancestor element level in the application's element tree. Si usa este enfoque, tenga cuidado al marcar cualquier evento Preview como controlado.If you use this approach, be cautious about marking any Preview event handled. En el ejemplo dado con PreviewMouseLeftButtonDown que se controla en el elemento raíz, si marcó el evento como Handled en la implementación del controlador, realmente suprimiría el Click evento.For the example given with PreviewMouseLeftButtonDown being handled at the root element, if you marked the event as Handled in the handler implementation, you would actually suppress the Click event. Normalmente, no es un comportamiento deseable.That is typically not desirable behavior.

Vea tambiénSee also