我碰到這個帖子想實現這樣的事情了一會兒後,就來了。我經常使用NI公司的Measurement Studio,他們的WinForms控件有事件StateChanging或StateChanged傳遞一個ActionEventArgs類型的參數,該參數有一個屬性Action,它可以有三個值:ByKeyboard,ByMouse和Programatic。這對確定導致控制狀態改變的因素非常有用。我想在標準的WinForms複選框中複製它。
這裏是我的代碼:
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;
}
}
我敢肯定有改進,使,但我的初步測試表明,它的作品。爲了防止其他人在這個問題上遇到困難,並且希望以更明確的方式區分變更發起的位置,我在此發佈了此信息。歡迎任何評論。
這是正確的方法。從技術上講,你應該在finally塊中將isFrozen設置爲false。 –