Vous pouvez aussi faire quelque chose comme changer une valeur de champ de drapeau sur MouseDown pour le bouton radio, puis en inversant la valeur de l'indicateur sur MouseClick. Puisque l'événement CheckedChanged se déclenche entre les deux, il peut utiliser l'indicateur avant qu'il ne soit retourné par l'événement MouseClick, et vous n'avez pas à vous soucier de réinitialiser son état.
Vous pouvez encore avoir des problèmes threading pour résoudre si vous utilisez un champ comme un drapeau (ne sais pas grand-chose à propos de l'application que vous travaillez), mais quelque chose comme cela devrait fonctionner:
private bool _mouseEvent;
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
if (_mouseEvent)
MessageBox.Show("Changed by mouse click.");
else
MessageBox.Show("Changed from code.");
}
private void radioButton1_MouseClick(object sender, MouseEventArgs e)
{
_mouseEvent = false;
}
private void radioButton1_MouseDown(object sender, MouseEventArgs e)
{
_mouseEvent = true;
}
private void button1_Click(object sender, EventArgs e)
{
// This simulates a change from code vs. a change from
// a mouse click.
if (radioButton1.Checked)
radioButton2.Checked = true;
else
radioButton1.Checked = true;
}
Alternativement, vous pouvez séparer votre logique d'application "clic-souris seulement" afin qu'elle soit déclenchée par un événement différent (comme MouseClick).
Espérons que cela aide.