2010-11-15 33 views
1

J'ai un ItemsControl lié à une source de données et générant plusieurs conteneurs. J'utilise du code pour m'assurer qu'un seul des conteneurs est visible à un moment donné. Les conteneurs utilisent un TemplateSelector donc le contenu de chaque conteneur est différent (ce qui exclut la recherche du contrôle par nom).WPF: Définition du focus pour un contrôle à l'intérieur d'un contrôle d'éléments

Je voudrais régler le focus du clavier sur le premier contrôle dans le conteneur actuellement visible. J'ai ajouté un gestionnaire d'événement à l'événement IsVisibleChanged pour chaque conteneur, mais lorsque j'accède au VisualTree, il n'y a pas d'enfants.

Des idées?

Répondre

0

Vous pouvez uniquement définir le focus sur l'élément enfant après que l'élément enfant lui-même est devenu visible. Une option consiste à rechercher l'élément enfant que vous souhaitez mettre en évidence, puis à ajouter un gestionnaire à son IsVisibleChanged. Dans le gestionnaire, mettez l'objet au point et supprimez le gestionnaire.

private void stackPanel1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (stackPanel1.IsVisible) 
    { 
     UIElement elm = stackPanel1.Children[0]; 
     FrameworkElement fwe = (FrameworkElement)elm; 
     fwe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged); 
    } 
} 

void fwe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    FrameworkElement fwe = (FrameworkElement)sender; 
    fwe.IsVisibleChanged -= new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged); 
    Keyboard.Focus((IInputElement)sender); 
} 

Edit: Vous devriez être en mesure d'accéder à la collection Items dans le gestionnaire d'événements IsVisibleChanged.

<ItemsControl Name="sp1" IsVisibleChanged="sp1_IsVisibleChanged" 
       ItemsSource="{Binding Items}" > 
</ItemsControl> 

Avec ce code:

void sp1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    Console.WriteLine(sp1.Items.Count); 
} 
+0

Mon problème est de trouver l'élément enfant. Ce que j'ai est un ContentPresenter qui devrait avoir les contrôles de n'importe quel modèle a été sélectionné mais son arbre visuel semble n'avoir aucun enfant. – Jim

+0

J'ai modifié la réponse avec du code qui accède à la collection d'éléments. J'ai testé cela et ça marche - je réalise que c'est différent de ce que vous décrivez mais j'aurais pensé que le concept était le même. Dois-je supprimer ma réponse afin que vous ayez une meilleure chance d'obtenir une réponse? –