Como definir o foco em um TextBox
elemento no WPF
Eu tenho este código:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...Mas isto não está funcionando.
Qualquer ideia?
Como definir o foco em um TextBox
elemento no WPF
Eu tenho este código:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...Mas isto não está funcionando.
Qualquer ideia?
Respostas:
Em XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
Ninguém explicou até agora porque o código em questão não funciona. Meu palpite é que o código foi colocado no construtor da janela. Mas neste momento é muito cedo para definir o foco. Isso deve ser feito quando a janela estiver pronta para interação. O melhor lugar para o código é o evento Loaded:
public KonsoleWindow() {
public TestWindow() {
InitializeComponent();
Loaded += TestWindow_Loaded;
}
private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
txtCompanyID.Focus();
}
}
Focus()
necessita do parâmetro foco estado - por exemplotxtCompanyId.Focus(FocusState.Keyboard)
experimente FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);
msdn:
Pode haver apenas um elemento em toda a área de trabalho que tem o foco do teclado. No WPF, o elemento que tem o foco do teclado terá IsKeyboardFocused definido como verdadeiro.
Você pode quebrar após a linha de configuração e verificar o valor da IsKeyboardFocused
propriedade. Verifique também se você realmente alcançou essa linha ou talvez tenha definido algum outro elemento para obter o foco depois disso.
Experimente isto: MyTextBox.Focus ( );
Nada disso funcionou para mim, pois eu estava usando uma grade em vez de um StackPanel.
Finalmente encontrei este exemplo: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/
e modificou para este:
Na seção '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>
Na minha definição de grade:
<Grid Style="{StaticResource FocusTextBox}" />
Caso você não tenha encontrado a solução nas outras respostas, resolvi assim o problema.
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);
Pelo que entendi, as outras soluções podem não funcionar porque a chamada para Focus()
é invocada antes que o aplicativo tenha renderizado os outros componentes.
Outra solução possível é usar FocusBehavior fornecido pelo DevExpress MVVM Framework gratuito :
<TextBox Text="This control is focused on startup">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:FocusBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
Ele permite que você foque um controle quando ele é carregado, quando um determinado evento é gerado ou uma propriedade é alterada.
No Code behind, você só consegue fazer isso.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
txtIndex.Focusable = true;
txtIndex.Focus();
}
Nota: Não vai funcionar antes de a janela ser carregada