Parece que quando um aplicativo WPF é iniciado, nada tem foco.
Isso é realmente estranho. Qualquer outra estrutura que usei faz exatamente o que você esperaria: coloca o foco inicial no primeiro controle na ordem das guias. Mas confirmei que é o WPF, não apenas o meu aplicativo - se eu criar uma nova janela, colocar uma caixa de texto nela e executar o aplicativo, a caixa de texto não terá foco até eu clicar nela ou pressionar Tab . Que nojo.
Meu aplicativo atual é mais complicado do que apenas um TextBox. Eu tenho várias camadas de UserControls dentro de UserControls. Um desses UserControls possui manipuladores Focusable = "True" e KeyDown / KeyUp, e quero que ele tenha o foco assim que minha janela for aberta. No entanto, ainda sou um novato no WPF e não estou tendo muita sorte em descobrir como fazer isso.
Se eu iniciar o aplicativo e pressionar a tecla Tab, o foco será direcionado para o meu controle de foco e ele começará a funcionar da maneira que eu quero. Mas não quero que meus usuários tenham que pressionar Tab antes de começarem a usar a janela.
Eu brinquei com o FocusManager.FocusedElement, mas não tenho certeza em qual controle defini-lo (a janela de nível superior? O pai que contém o controle focalizável? O próprio controle focalizável?) Ou o que defini-lo.
O que preciso fazer para que meu controle profundamente aninhado tenha foco inicial assim que a janela abrir? Ou, melhor ainda, focar o primeiro controle focalizável na ordem das guias?
Tive a brilhante idéia de pesquisar no Reflector para ver onde a propriedade Focusable é usada e encontrei o caminho para esta solução. Eu só preciso adicionar o seguinte código ao construtor do meu Window:
Isso selecionará automaticamente o primeiro controle na ordem das guias, portanto, é uma solução geral que deve poder ser solta em qualquer janela e Just Work.
fonte
Button
. Para corrigir isso, viro aMoveFocus
chamada pelo despachante comContextIdle
prioridade (Background
ou superior, não funciona). Além disso, existe umFocusNavigationDirection.First
que corresponde melhor à intenção e faz a mesma coisa neste caso.Com base na resposta aceita implementada como um comportamento anexado:
Use-o assim:
fonte
DependencyProperty.RegisterAttached
. O terceiro parâmetro deve sertypeof(FocusBehavior)
, nãotypeof(Control)
. Fazer essa alteração impedirá que o designer relate a propriedade 'FocusFirst' já registrada por erros de 'Controle'.Encontrei outra solução possível. Mark Smith postou uma extensão de marcação FirstFocusedElement para uso com o FocusManager.FocusedElement.
fonte
Depois de ter um 'Pesadelo de foco inicial do WPF' e com base em algumas respostas na pilha, o seguinte provou ser a melhor solução.
Primeiro, adicione seu App.xaml OnStartup () da seguinte maneira:
Em seguida, adicione o evento 'WindowLoaded' também no App.xaml:
O problema de encadeamento deve ser usado, pois o foco inicial do WPF falha principalmente devido a algumas condições de corrida da estrutura.
Encontrei a melhor solução a seguir, pois é usada globalmente em todo o aplicativo.
Espero que ajude...
Oran
fonte
BeginInvoke
vez dessaSleep(100)
afirmação assustadora .Tinha o mesmo problema resolvido com uma solução simples: Na janela principal:
No controle do usuário:
fonte
Você pode facilmente ter o controle definido como o elemento focado no XAML.
Eu nunca tentei definir isso em um controle de usuário e ver se isso funciona, mas pode.
fonte
Uma versão mínima da resposta de Mizipzor para C # 6+.
Use no seu XAML:
fonte
Se você é como eu e está usando algumas estruturas que, de alguma forma, atrapalham os comportamentos básicos de foco e tornam todas as soluções acima irrelevantes, você ainda pode fazer isso:
1 - Observe o elemento que recebe o foco (seja o que for!)
2 - Adicione isso no seu código por trás de xxx.xaml.cs
3 - Adicione isso ao elemento que recebe o primeiro foco:
4 - Adicione o método Element_GotFocus no código por trás e especifique o elemento nomeado WPF que precisa do primeiro foco:
5 - Gerenciar o evento carregado
em XAML
em xaml.cs
Espero que isso ajude como uma solução de último recurso
fonte
Eu também enfrentei o mesmo problema. Eu tinha três caixas de texto dentro do contêiner de lona e queria que a primeira caixa de texto fosse focada quando o controle do usuário fosse aberto. O código WPF seguiu o padrão MVVM. Criei uma classe de comportamento separada para focar o elemento e vinculei-o à minha visão dessa maneira.
Código de comportamento da tela
Código para visualização
fonte
A solução acima não estava funcionando como esperado para mim, alterei um pouco o comportamento proposto por Mizipzor da seguinte maneira:
Desta parte
Para isso
E eu não estou anexando esse comportamento ao Window ou UserControl, mas para controlar, quero focar inicialmente, por exemplo:
Ah, desculpe por nomes diferentes. Estou usando o nome InitialFocus para a propriedade anexada.
E isso está funcionando para mim, talvez possa ajudar outra pessoa.
fonte
fonte