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?

priyanka.sarkar
fuente
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>
útilAbeja
fuente
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();
  }
}
Peter Huber
fuente
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
49

prueba FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
Arsen Mkrtchyan
fuente
5
¿Qué sucede si el elemento en el que desea establecer el enfoque es el elemento padre oO?
Brock Hensley
10
FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
Philter
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.

Svetlozar Angelov
fuente
19

Prueba esto : MyTextBox.Focus ( );

NazOok
fuente
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}" />
Anya Hope
fuente
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.

anemomylos
fuente
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.

Alex Russkov
fuente
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

MindRoasterMir
fuente