Cómo establecer el foco en un TextBox
elemento en WPF
Tengo este codigo:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...Pero no está funcionando.
¿Alguna idea?
Cómo establecer el foco en un TextBox
elemento en WPF
Tengo este codigo:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...Pero no está funcionando.
¿Alguna idea?
Respuestas:
En XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
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();
}
}
Focus()
requiere el parámetro de estado de enfoque, por ejemplotxtCompanyId.Focus(FocusState.Keyboard)
prueba FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
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 IsKeyboardFocused
propiedad. También verifique si realmente llega a esa línea o tal vez establece algún otro elemento para enfocarse después de eso.
Prueba esto : MyTextBox.Focus ( );
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}" />
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.
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.
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