mi sono imbattuto in questo post dopo che vogliono implementare qualcosa di simile a questo per un po '. Utilizzo regolarmente Measurement Studio da National Instruments e i relativi controlli WinForm che hanno l'evento StateChanging o StateChanged che passano un parametro di tipo ActionEventArgs, che ha una proprietà Action che può assumere tre valori: ByKeyboard, ByMouse e Programatic. Questo è molto utile per determinare cosa ha causato la modifica dello stato del controllo. Volevo replicarlo in una casella di controllo standard di WinForms.
Ecco il mio codice:
public enum ControlSource
{
Programatic,
ByKeyboard,
ByMouse
}
public class AwareCheckBox : Checkbox
{
public AwareCheckBox()
: base()
{
this.MouseDown += AwareCheckbox_MouseDown;
this.KeyDown += AwareCheckbox_KeyDown;
}
private ControlSource controlSource = ControlSource.Programatic;
void AwareCheckbox_KeyDown(object sender, KeyEventArgs e)
{
controlSource = ControlSource.ByKeyboard;
}
void AwareCheckbox_MouseDown(object sender, MouseEventArgs e)
{
controlSource = ControlSource.ByMouse;
}
public new event AwareControlEventHandler CheckedChanged;
protected override void OnCheckedChanged(EventArgs e)
{
var handler = CheckedChanged;
if (handler != null)
handler(this, new AwareControlEventArgs(controlSource));
controlSource = ControlSource.Programatic;
}
}
public delegate void AwareControlEventHandler(object source, AwareControlEventArgs e);
public class AwareControlEventArgs : EventArgs
{
public ControlSource Source { get; private set; }
public AwareControlEventArgs(ControlSource s)
{
Source = s;
}
}
Sono sicuro che ci sono miglioramenti da fare, ma il mio test rudimentale ha dimostrato che funziona. Ho postato qui semplicemente nel caso in cui altri si imbattessero in questo problema e volessero un modo più chiaro di distinguere dove è stata avviata la modifica. Qualsiasi commento benvenuto.
Questo è il modo corretto. Tecnicamente dovresti impostare isFrozen su false in un blocco finally. –