controlar evento de foco perdido ao usar atalhos de teclado
Pergunta
Para ambos WinForms e Windows Presentation Foundation, se eu tenho uma caixa de texto que o usuário acaba de entrar texto e um botão, se o usuário clica no botão "LostFocus" evento é acionado antes de o evento é acionado o botão de clique . No entanto, se o usuário utiliza um atalho de teclado para o botão (texto de exemplo Button é "& botão" ou "_Button" e executa usuário Alt + B), então o "LostFocus" evento é acionado após o evento clique de botão, que é menos útil.
Você sabe de soluções alternativas razoáveis? Nós temos várias coisas que queremos ocorrer em LostFocus antes ButtonClick.
Solução
Você poderia tentar rastrear ou não a lógica foco perdido ocorreu antes de disparar a lógica botão. Você realmente não deve ter o código diretamente no manipulador de qualquer maneira. Você poderia fazer algo parecido com isto:
public partial class Form1 : Form
{
private Boolean _didLostFocusLogic;
public Form1()
{
InitializeComponent();
}
private void textBox1_Leave(object sender, EventArgs e)
{
LostFocusLogic();
}
private void button1_Click(object sender, EventArgs e)
{
ButtonClickLogic();
}
private void LostFocusLogic()
{
/* Do stuff */
_didLostFocusLogic = true;
}
private void ButtonClickLogic()
{
if (!_didLostFocusLogic)
LostFocusLogic();
_didLostFocusLogic = false; // Reset for next time.
/* Do stuff */
}
}
Outras dicas
O que aconteceria se você fez isso em primeiro lugar no manipulador de botão? (Ou talvez subclasse o botão e substituir OnClick para aplicar essa lógica "em todo o mundo").
Button b = (Button) sender;
b.Focus();
Oxalá contornar o problema?