Eu quero adicionar um comportamento simples (pelo menos eu pensei que era) ao meu WPF TextBox
.
Quando o usuário pressiona Escape, quero que o que TextBox
ele está editando tenha o texto que tinha quando o usuário começou a editar, E quero remover o foco do TextBox
.
Não tenho nenhum problema em configurar o texto para o valor que tinha no início da edição.
O problema é remover o foco do elemento. Não quero mover o foco para nenhum outro componente, só quero TextBox
perder o foco. Terei que ter um elemento invisível para definir o foco e TextBox
perder o foco?
Keyboard.ClearFocus()
partir do code-behind após um clique em algum lugar.ClearFocus
fazGotFocus
com que não dispare para o controle recentemente focado enquanto ainda dispara para outros controles. Esse é um grande problema para meu teclado na tela personalizado, por exemplo. Isso faz com que o cursor desapareça, o que provavelmente é tudo o que o "foco do teclado" envolve. Talvez eu esteja mais interessado em algo como "foco do mouse".other.Focus()
.GotFocus
evento). Sempre há algo com foco lógico em seu programa. Use oLostKeyboardFocus
evento ou mude o foco para outro elemento (que muda o foco lógico junto com ele) antes de limpar o foco do teclado.O código que tenho usado:
fonte
Um pouco tarde para a festa, mas foi útil para mim, então aqui vai.
Desde .Net 3.0,
FrameworkElement
tem uma função MoveFocus que fez o truque para mim.fonte
Como nenhuma das respostas acima funcionou para mim e a resposta aceita funciona apenas para o foco do teclado, cheguei à seguinte abordagem:
Mata tanto o foco lógico quanto o do teclado.
fonte
Você pode definir o foco para um ancestral focalizável. Este código funcionará mesmo se a caixa de texto estiver dentro de um modelo sem ancestrais focalizáveis dentro do mesmo modelo:
fonte
AFAIK, não é possível remover completamente o foco. Algo em sua janela sempre terá o foco.
fonte
No desenvolvimento do Windows Phone, acabei de fazer
Focus()
outhis.Focus()
na PhoneApplicationPage e funcionou perfeitamente .fonte
Para mim, é bastante complicado, especialmente ao usar com ligação LostFocus. No entanto, minha solução alternativa é adicionar um rótulo vazio e me concentrar nele.
...
fonte
Minha resposta não aborda a questão acima diretamente, no entanto, eu sinto que a formulação dela fez com que ela se tornasse "A Questão" sobre como se livrar programaticamente do foco. Um cenário comum onde isso é necessário é que o usuário consiga limpar o foco clicando com o botão esquerdo do mouse no plano de fundo de um controle raiz, como uma janela.
Então, para conseguir isso, você pode criar um comportamento anexado que mudará o foco para um controle criado dinamicamente (no meu caso, um rótulo vazio). É preferível usar esse comportamento nos elementos de nível mais alto, como janelas, pois ele itera por meio de seus filhos para encontrar um painel ao qual possa adicionar um rótulo fictício.
fonte