Partilhar via


Pré-visualizar eventos

Os eventos de visualização, também conhecidos por eventos de tunelamento, são eventos roteados em que a rota é direcionada da raiz da aplicação para o elemento que gerou o evento, sendo relatado como a fonte nos dados do evento. Nem todos os cenários de eventos suportam ou exigem eventos de visualização; Este tópico descreve as situações em que existem eventos de visualização, como os aplicativos ou componentes devem manipulá-los e casos em que a criação de eventos de visualização em componentes ou classes personalizados pode ser apropriada.

Visualizar eventos e entrada de dados

Ao lidar com eventos de visualização em geral, tenha cuidado ao marcar os eventos manipulados nos dados do evento. A manipulação de um evento Preview em qualquer elemento diferente do elemento que o gerou (o elemento que é relatado como a fonte nos dados do evento) tem o efeito de não fornecer a um elemento a oportunidade de manipular o evento que ele originou. Às vezes, este é o resultado desejado, particularmente se os elementos em questão existem em relações dentro da composição de um controle.

Para eventos de entrada especificamente, os eventos de visualização também compartilham instâncias de dados de evento com o evento borbulhante equivalente. Se você usar um manipulador de classe de evento Preview para marcar o evento de entrada manipulado, o manipulador de classe de evento de entrada borbulhante não será invocado. Ou, se você usar um manipulador de instância de evento Preview para marcar o evento manipulado, os manipuladores para o evento borbulhante normalmente não serão invocados. Manipuladores de classe ou manipuladores de instância podem ser registrados ou anexados com uma opção a ser invocada mesmo se o evento estiver marcado como manipulado, mas essa técnica não é comumente usada.

Para obter mais informações sobre a manipulação de classes e como esta se relaciona com os eventos de pré-visualização, consulte Marcar Eventos Roteados como Manipulados eManipulação de Classes.

Trabalhando em torno da supressão de eventos por controles

Um cenário em que os eventos de pré-visualização são comumente usados é para a manipulação de controlos compostos de eventos de entrada. Às vezes, o autor do controle suprime um determinado evento de ter origem no seu controle, talvez para substituir um evento definido por um componente que transmite mais informações ou implica um comportamento mais específico. Por exemplo, um Button do Windows Presentation Foundation (WPF) suprime os eventos de propagação MouseLeftButtonDown e MouseRightButtonDown gerados pelo Button ou seus elementos compostos, para capturar o rato e acionar um evento Click que é sempre gerado pelo próprio Button. O evento e seus dados ainda continuam ao longo da rota, mas como o Button marca os dados do evento como Handled, apenas os manipuladores do evento que indicaram especificamente que devem agir no caso handledEventsToo são invocados. Se outros elementos em direção à raiz da sua aplicação ainda quisessem uma oportunidade de manipular um evento com controle suprimido, uma alternativa é adicionar manipuladores no código com handledEventsToo especificado como true. Mas, muitas vezes, uma técnica mais simples é alterar a direção de roteamento que você manipula para ser o equivalente de visualização de um evento de entrada. Por exemplo, se um controle suprimir MouseLeftButtonDown, tente anexar um manipulador para PreviewMouseLeftButtonDown em vez disso. Essa técnica só funciona para eventos de entrada de elemento base, como MouseLeftButtonDown. Esses eventos de entrada usam pares de túnel/bolha, geram ambos os eventos e compartilham os dados do evento.

Cada uma destas técnicas tem efeitos secundários ou limitações. O efeito colateral de manipular o evento Preview é que manipular o evento nesse ponto pode desabilitar manipuladores que esperam manipular o evento borbulhante e, portanto, a limitação é que geralmente não é uma boa ideia marcar o evento manipulado enquanto ele ainda está na parte Preview da rota. A limitação da técnica handledEventsToo é que você não pode especificar um manipulador de handledEventsToo em XAML como um atributo, você deve registrar o manipulador de eventos no código depois de obter uma referência de objeto ao elemento onde o manipulador deve ser anexado.

Ver também