Establecer el foco en el cuadro de texto en WPF


105

Cómo establecer el foco en un TextBoxelemento en WPF

Tengo este codigo:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

...Pero no está funcionando.

¿Alguna idea?


txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); funciona, pero así es como.
MindRoasterMir

Respuestas:


145

En XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>

9
Prefiero este enfoque a los demás anteriores, ya que se mantiene en línea con MVVM.
Todd Sprang

1
El elemento enfocado es de solo lectura correcto ¿Cómo se puede configurar en xaml? Usé esto y no funcionó <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK

@ user841612, consulte el siguiente enlace y verifique el ensamblado y el espacio de nombres msdn.microsoft.com/en-us/library/…
helpfulBee

Esto solo funciona una vez. Si desea cambiar el enfoque después de que se haya creado la página, debe hacerlo mediante programación.
Joe Steele

esto también funciona. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir

51

Nadie explicó hasta ahora por qué el código de la pregunta no funciona. Supongo que el código se colocó en el constructor de la ventana. Pero en este momento es demasiado pronto para establecer el enfoque. Debe realizarse una vez que la ventana esté lista para la interacción. El mejor lugar para el código es el evento Loaded:

public KonsoleWindow() {
  public TestWindow() {
    InitializeComponent();
    Loaded += TestWindow_Loaded;
  }

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}

1
Lógicamente cierto, después de demasiada lucha, esta respuesta es bastante buena y perfecta como solución.
shivani

esto funcionó para mí. la respuesta aceptada no lo hizo. Gracias
BoundForGlory

No estoy seguro de si la versión es específica, pero Focus()requiere el parámetro de estado de enfoque, por ejemplotxtCompanyId.Focus(FocusState.Keyboard)
Dan


26
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

Solo puede haber un elemento en todo el escritorio que tenga el foco del teclado. En WPF, el elemento que tiene el foco del teclado tendrá IsKeyboardFocused establecido en verdadero.

Puede romper después de la línea de ajuste y verificar el valor de la IsKeyboardFocusedpropiedad. También verifique si realmente llega a esa línea o tal vez establece algún otro elemento para enfocarse después de eso.


19

Prueba esto : MyTextBox.Focus ( );


2
Esta es la respuesta más elegante y no requiere que especifique también el padre. Gracias por esto, ¡funciona muy bien para mí!
dbeachy1

La respuesta de Peter Huber hace esto, pero explica que la ventana debe cargarse primero, por lo que la mía no funcionaba
Adriaan Davel

14

Nada de esto funcionó para mí ya que estaba usando una cuadrícula en lugar de un StackPanel.

Finalmente encontré este ejemplo: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

y lo modificó a esto:

En la sección 'Recursos':

    <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

En mi definición de cuadrícula:

<Grid Style="{StaticResource FocusTextBox}" />

2
Esto también funcionó para mí. El resto no lo fue. Gracias por el enlace, eso fue bastante interesante. También es interesante que algo tan simple pueda ser tan complicado.
TravisWhidden

2
La respuesta anterior funciona bien independientemente de si el contenedor es un Gird o un StackPanel. Dado que la estructura de su cuadrícula no está clara, es difícil saber qué pudo haber salido mal. Aunque es bueno ver alternativas.
útilBee

1
Para mí, este también es el único que funciona correctamente. Buena manera.
OregonGhost

7

En caso de que no haya encontrado la solución en las otras respuestas, así es como resolví el problema.

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);

Por lo que entiendo, es posible que las otras soluciones no funcionen porque la llamada a Focus()se invoca antes de que la aplicación haya procesado los otros componentes.


3
Esta respuesta merece una mejor clasificación.
Simon Mourier

0

Otra posible solución es utilizar FocusBehavior proporcionado por DevExpress MVVM Framework gratuito :

<TextBox Text="This control is focused on startup">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:FocusBehavior/>
    </dxmvvm:Interaction.Behaviors>
</TextBox>

Le permite enfocar un control cuando está cargado, cuando se genera un evento determinado o se cambia una propiedad.


0

En Code behind, solo puedes lograrlo haciendo esto.

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtIndex.Focusable = true;
            txtIndex.Focus();
        }

Nota: no funcionará antes de que se cargue la ventana

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.