2010-12-16 2 views
2

Gibt es eine entsprechende Methode zu WinForms ProcessTabKey in Silverlight oder eine Möglichkeit, es korrekt zu simulieren?Gibt es eine ProcessTabKey-Entsprechung in Silverlight (Fokus auf dem nächsten Steuerelement in der Hierarchie)

Umsehen, was ich sehe, sind Leute, die hart jedes einzelne Steuerelement kodieren (Text1 hat ein KeyDown-Ereignis, um Text2 zu fokussieren, Text2 hat ein KeyDown-Ereignis, um Text3 zu fokussieren, usw.). Einige haben sich dazu durchgerungen, einen Teil der Layout-Hierarchie basierend auf TabIndex abzufragen, aber standardmäßig haben alle Steuerelemente den gleichen TabIndex, so dass es sich wieder um eine manuelle Setup-Aufgabe handelt.

Eine letzte Falte beschäftigt sich mit verschachtelten Containern. Zum Beispiel ein vertikal ausgerichteter Stapel von Textfeldern, gefolgt von einem horizontal ausgerichteten Stapel von Schaltflächen. Die meisten programmatischen Ansätze, die ich gesehen habe, versuchen alle Steuerelemente als direkte Kinder des gleichen übergeordneten Containers anzunehmen.

Ich verstehe, dass Silverlight unter einigen Einschränkungen funktionieren muss, um zu verhindern, dass eine Silverlight-Anwendung den Fokus zurück auf einen Teil des Browsers setzt (ein potenzielles Sicherheitsrisiko), aber ich hoffe, dass es einen Weg gibt, Tab-Setup ohne manuelle Bearbeitung aller Formen.

Antwort

0

Es gibt eine ähnliche Frage in Stackoverflow: Auto-tab in Silverlight 3

ich ein benutzerdefiniertes angebrachtes Verhalten bin mit (System.Windows.Interactivity) Code-behind zu vermeiden, weil Iand gut mit MVVM funktioniert.

<UserControl x:Class="SCO.Ria.UI.Views.LoginView" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:local="clr-namespace:Caliburn.Micro.Focus;assembly=Caliburn.Micro.Focus" mc:Ignorable="d" 
d:DesignHeight="154" d:DesignWidth="468"> 

    <interactivity:Interaction.Behaviors> 
     <local:TabNextBehavior/> 
    </interactivity:Interaction.Behaviors> 

</UserControl> 

TabNextBehavior.cs:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using System.Windows.Interactivity; 

namespace Caliburn.Micro.Focus { 

public class TabNextBehavior : Behavior<Control> { 

    protected override void OnAttached() { 
     base.OnAttached(); 

     this.AssociatedObject.KeyUp += AssociatedObject_KeyUp; 
    } 

    protected override void OnDetaching() { 
     base.OnDetaching(); 

     this.AssociatedObject.KeyUp -= AssociatedObject_KeyUp; 
    } 

    void AssociatedObject_KeyUp(object sender, KeyEventArgs args) { 

     if (args.Key == System.Windows.Input.Key.Enter) { 

      DependencyObject parent = null; 
      if (AssociatedObject is ChildWindow) 
       parent = ((ChildWindow)parent).Content as DependencyObject; 
      else parent = AssociatedObject; 

      parent.TabNext(); //extensin Method from VisualTreeExtensions.cs 
     } 
    } 
} 

Sie einen Kern hier sehen können: https://gist.github.com/4576803

Verwandte Themen