Réglage de Focus sur un Contrôle dans un ControlTemplate dans WPF

Dans une application que je suis en train de travailler sur le, nous avons un tas de contrôles personnalisés avec leurs ControlTemplates défini dans le Générique.xaml.

Par exemple, notre coutume zone de texte devrait ressembler à ceci:

<Style TargetType="{x:Type controls:FieldTextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:FieldTextBox}">
                <Border BorderThickness="0" Margin="5">
                    <StackPanel ToolTip="{Binding Path=Field.HintText, RelativeSource={RelativeSource TemplatedParent}}">
                        <TextBlock Text="{Binding Path=Field.FieldLabel, RelativeSource={RelativeSource TemplatedParent}}" 
                                   HorizontalAlignment="Left" 
                                   />
                        <TextBox Width="{Binding Path=Field.DisplayWidth, RelativeSource={RelativeSource TemplatedParent}}" 
                                 HorizontalAlignment="Left" 
                                 Text="{Binding Path=Field.Data.CurrentValue, RelativeSource={RelativeSource TemplatedParent}}" 
                                 IsEnabled="{Binding Path=Field.IsEnabled, RelativeSource={RelativeSource TemplatedParent}}"
                                 ContextMenu="{Binding Source={StaticResource FieldContextMenu}}" >
                            <TextBox.Background>
                                <SolidColorBrush Color="{Binding Path=Field.CurrentBackgroundColor, RelativeSource={RelativeSource TemplatedParent}}"/>
                            </TextBox.Background>
                        </TextBox>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Focusable" Value="True" />
    <Setter Property="IsTabStop" Value="False" />
</Style>

Dans notre application, nous devons être en mesure de par programmation à définir le focus sur un contrôle particulier au sein de la ControlTemplate.

Au sein de notre code C#, nous pouvons obtenir le particulier "FieldTextBox" basé sur nos données. Une fois que nous avons la bonne FieldTextBox, nous devons être en mesure de définir le focus sur la zone de texte contenu dans le ControlTemplate.

La meilleure solution que j'ai trouvé est de mettre un nom sur le contrôle primaire dans chaque modèle de contrôle (dans ce cas, c'est la zone de texte), comme "FocusableControl."

Mon code (contenues dans le code-behind pour le FieldTextBox) pour ensuite définir le focus sur le contrôle serait:

    Control control = (Control)this.Template.FindName("FocusableControl", this);
    if (control != null)
    {
        control.Focus();
    }

Cette solution fonctionne. Cependant, quelqu'un d'autre sait d'une solution qui serait plus efficace que cela?

OriginalL'auteur Bob Wintemberg | 2008-10-01