2009-02-28 11 views
0

J'ai tenté de gérer l'événement KeyDown d'un UserControl (page) dans mon application Silverlight, mais il semble y avoir un comportement étrange de la part de la fonctionnalité de saisie utilisateur Silverlight. L'événement ne se soulève en aucune circonstance. J'ai même essayé d'attacher le gestionnaire d'événement à chaque contrôle de conteneur dans le UserControl, mais toujours sans succès. En effet, le système d'entrée de l'événement Silverlight est assez nouveau et me semble plutôt étrange, donc c'est peut-être juste un malentendu de ma part, même si je n'ai pas la moindre idée de la marche à suivre.La page Silverlight n'attrape pas les événements d'entrée

Le code suivant est un modèle de la page particulière avec laquelle je suis en train de tester.

<UserControl x:Class="MyNamespace.CreditsPage" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      KeyDown="UserControl_KeyDown"> 
    <Grid x:Name="LayoutRoot"> 
     <Border> 
      <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Vertical"> 
       <TextBlock TextAlignment="Center"> 
       A line of text.<LineBreak /> 
       <LineBreak /> 
       A line of text.<LineBreak /> 
       <LineBreak /> 
       A line of text.<LineBreak /> 
       <LineBreak /> 
       A line of text.<LineBreak /> 
       </TextBlock> 
      </StackPanel> 
     </Border> 
    </Grid> 
</UserControl> 

En WPF, la solution évidente pour une telle question serait de gérer l'événement PreviewKeyDown, mais malheureusement, ce n'est pas disponible dans Silverlight 2. Toutes les idées seront les bienvenues (et une brève explication des raisons pour lesquelles le routage des événements Silverlight se comporte comme il est).

+0

Huh, en baisse de vote? – Noldorin

Répondre

2

Vous pouvez gérer l'entrée utilisateur de la principale UIElement: Application.Current.RootVisual

Application.Current.RootVisual.KeyDown += Application_KeyDown 

Ensuite, vous pouvez gérer dans la méthode Application_KeyDown toutes les entrées utilisateur à partir du clavier.

Vous pouvez également consulter ce numéro: Handling KeyDown event in a Canvas

1

J'ai essayé le xaml que vous avez fourni et n'ai pas rencontré de problème lors de la transmission de l'événement KeyDown.

Une chose pourrait en être la cause: le plugin Silverlight ne verra que les événements d'entrée s'il est mis au point. Alors essayez et cliquez sur le contenu Silverlight dans le navigateur pour lui donner l'accent de saisie avant d'appuyer sur les touches. Faites-moi savoir si cela résout votre problème ou non.

+0

Ah, il semble que c'était en fait la page UserControl racine qui attrapait l'événement KeyDown. La situation que j'ai décrite dans mon article était légèrement inexacte parce que le UserControl spécifié dans ce XAML était en fait le contenu/enfant d'une SwitcherPage. – Noldorin

+0

(suite) Ma question est la suivante: puis-je forcer la page de contenu de la SwitcherPage à capturer les événements de saisie de l'utilisateur? Si je ne peux pas, il est facile de gérer les événements de la SwitcherPage et de les diriger, mais je suis curieux de savoir s'il existe une solution plus directe. Merci pour votre réponse de toute façon. – Noldorin

+0

Vous pourriez faire comme l'autre affiche suggère et gérer l'événement sur le RootVisual. Si vous faites cela, vous voulez vous assurer que vous supprimez votre gestionnaire de cet événement lorsque vous supprimez votre UserControl de l'arborescence; sinon, votre UserControl continuera à recevoir des événements. – KeithMahoney