Вы также можете сделать что-то вроде изменения значения поля флага на MouseDown для радиокнопки, а затем возврата значения флага на MouseClick. Так как событие CheckedChanged возникает между ними, он может использовать флаг, прежде чем он будет отменен событием MouseClick, и вам не нужно беспокоиться о сбросе его состояния.
У вас все еще могут быть проблемы с многопоточностью, если вы используете поле в качестве флага (не очень много знаете о приложении, над которым работаете), но что-то вроде этого должно работать:
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;
}
Кроме того, вы можете отделить логику приложения «только щелчок мышью», чтобы она запускалась другим событием (например, MouseClick).
Надеюсь, это поможет.