Establecer el enfoque en un control dentro de una plantilla de control en WPF

En una aplicación en la que estoy trabajando, tenemos un montón de controles personalizados con sus Plantillas de Control definidas en Generic.xaml.

Por ejemplo, nuestro cuadro de texto personalizado sería similar a esto:

                    

En nuestra aplicación, debemos ser capaces de establecer programáticamente el enfoque en un control particular dentro de la Plantilla ControlTemplate.

Dentro de nuestro código C #, podemos llegar al “FieldTextBox” en particular basado en nuestros datos. Una vez que tengamos el FieldTextBox correcto, debemos ser capaces de enfocarnos en el TextBox real contenido dentro de ControlTemplate.

La mejor solución que he encontrado es establecer un nombre en el control principal de cada plantilla de control (en este caso es el TextBox), como “FocusableControl”.

Mi código (contenido en el código subyacente para FieldTextBox) para luego enfocar el control sería:

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

Esta solución funciona. Sin embargo, ¿alguien más sabe de una solución que sea más eficiente que esta?

Dentro de la plantilla de control, puede agregar un Desencadenador que establece el elemento enfocado del FocusManager del StackPanel en el cuadro de texto que desea enfocar. Establece la propiedad del activador en {TemplateBinding IsFocused} para que se dispare cuando el control que contiene está enfocado.

Puede deshacerse de la encoding rígida del nombre de control en el código al proporcionar un DependancyProperty y tener el mismo código en controlLoaded o OnApplyTemplate según la DependancyProperty. El remitente de DependancyProperty será el candidato para la llamada a .Focus ().