Eu prefiro essa abordagem às outras acima, pois ela segue em linha com o MVVM.
Todd Sprang
1
O elemento focado é somente leitura correto Como você pode definir no xaml? Usei isso e não funcionou <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
Isso só funciona uma vez. Se você quiser alterar o foco após a criação da página, será necessário fazê-lo programaticamente.
Joe Steele
isso também funciona. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir
51
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:
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 IsKeyboardFocusedpropriedade. Verifique também se você realmente alcançou essa linha ou talvez tenha definido algum outro elemento para obter o foco depois disso.
Isso funcionou para mim também. O resto não foi. Obrigado pelo link, foi bem interessante. Também é interessante que uma coisa tão simples possa ser tão complicada.
TravisWhidden
2
A resposta acima funciona bem, independentemente se o contêiner é um Gird ou StackPanel. Como a estrutura de sua grade não é clara, é difícil dizer o que pode ter dado errado. É bom ver alternativas embora.
útilBee,
1
Para mim, este também é o único que funciona corretamente. Bom caminho.
OregonGhost
7
Caso você não tenha encontrado a solução nas outras respostas, resolvi assim o problema.
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.
Respostas:
Em XAML:
fonte
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:
fonte
Focus()
necessita do parâmetro foco estado - por exemplotxtCompanyId.Focus(FocusState.Keyboard)
experimente FocusManager.SetFocusedElement
fonte
msdn:
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.fonte
Experimente isto:
MyTextBox.Focus ( );
fonte
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':
Na minha definição de grade:
fonte
Caso você não tenha encontrado a solução nas outras respostas, resolvi assim o problema.
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.fonte
Outra solução possível é usar FocusBehavior fornecido pelo DevExpress MVVM Framework gratuito :
Ele permite que você foque um controle quando ele é carregado, quando um determinado evento é gerado ou uma propriedade é alterada.
fonte
No Code behind, você só consegue fazer isso.
Nota: Não vai funcionar antes de a janela ser carregada
fonte