2009-02-28 11 views
0

Ich habe versucht, das KeyDown-Ereignis eines UserControl (Seite) in meiner Silverlight-Anwendung zu behandeln, aber es scheint etwas merkwürdiges Verhalten seitens der Silverlight-Benutzereingabefunktionalität zu geben. Die Veranstaltung wird unter keinen Umständen ausgelöst. Ich habe sogar versucht, den Event-Handler an jedes Container-Steuerelement innerhalb des UserControl anzuhängen, aber immer noch ohne Glück. Tatsächlich ist das Silverlight-Benutzereingabe- "Ereignis-Routing" -System ziemlich neuartig und scheint mir ziemlich seltsam zu sein, so dass es vielleicht nur ein Missverständnis von mir ist, obwohl ich ziemlich ahnungslos darüber bin, wie ich vorgehen soll.Silverlight-Seite keine Eingangsereignisse abfangen

Der folgende Code ist eine Vorlage der jeweiligen Seite, mit der ich gerade teste.

<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> 

In WPF, die offensichtliche Lösung für ein solches Problem wäre das PreviewKeyDown Ereignis zu behandeln, aber das ist leider nicht verfügbar in Silverlight 2. Irgendwelche Ideen wäre zu begrüßen (und eine kurze Erklärung, warum Silverlight Event-Routing verhält sich so wie es ist).

+0

Huh, unten Abstimmung? – Noldorin

Antwort

1

Ich habe versucht, die XAML, die Sie zur Verfügung gestellt und hatte kein Problem bei der Übergabe des KeyDown-Ereignisses.

Eine Sache, die es verursachen könnte: Das Silverlight-Plugin wird nur Eingangsereignisse sehen, wenn es fokussiert ist. Versuchen Sie also, auf den Silverlight-Inhalt im Browser zu klicken, um den Eingabefokus zu erhalten, bevor Sie die Tasten drücken.

Lassen Sie mich wissen, ob das Ihr Problem löst oder nicht. Application.Current.RootVisual

Application.Current.RootVisual.KeyDown += Application_KeyDown 

Dann sind Sie in der Application_KeyDown Methode, um alle Benutzereingaben von der Tastatur umgehen können:

+0

Ah, es scheint, dass es in der Tat die Root-UserControl-Seite war, die das KeyDown-Ereignis abfing. Die Situation, die ich in meinem Beitrag beschrieben habe, war etwas ungenau, da das in diesem XAML angegebene UserControl tatsächlich der Inhalt/das Kind einer SwitcherPage war. – Noldorin

+0

(Forts.) Meine Frage lautet nun: Kann ich die Inhaltsseite der SwitcherPage zwingen, Benutzereingabeereignisse zu erfassen? Wenn ich es nicht kann, ist es einfach, die Ereignisse in der SwitcherPage zu bearbeiten und dann zu steuern, aber ich bin neugierig, ob es eine direktere Lösung gibt. Danke für deine Antwort trotzdem. – Noldorin

+0

Sie könnten tun, wie das andere Plakat vorschlägt und behandeln Sie das Ereignis auf dem RootVisual. Wenn Sie dies tun, möchten Sie sicherstellen, dass Sie Ihren Handler von diesem Ereignis entfernen, wenn Sie Ihr Benutzersteuerelement aus der Baumstruktur entfernen. Andernfalls empfängt Ihr Benutzersteuerelement weiterhin Ereignisse. – KeithMahoney