我正在听取一些意见/建议,因为我对事件驱动编程很新,而C#来自网络开发的起源。
我目前正在使用C#/ Winforms创建一个程序,主窗体上有一系列SplitContainer
控件。我想让用户有效地选择一组,比如8中的任何一个(不限于此)。要开始选择它们,用户将单击一个按钮,程序将进入选择模式,此时,如果用户点击一个控件,它的颜色将发生变化,表明它已被选中。
在这个阶段,我已经使它工作正常,但我觉得它在检测MouseMove事件时效率不高。我已将MouseMove事件绑定到SplitContainer,在该事件内,程序会检测我们是否处于选择模式。如果是,并且用户单击,则更改颜色。如果不是在选择模式,那么它什么都不做。
我担心的是,每次用户将光标移到控件上时,都会触发此事件,并检测是否启用了选择模式。我觉得这应该是另一种方式,那就是;只有在选择模式中才会听到这样的事件。
以下是一些解释我目前所得到的内容。
public bool selectingMode = false;
public Form(){
SplitContainer split = new SplitContainer();
split.MouseMove += new MouseEventHandler(MouseMoved);
this.Controls.Add(split);
}
void MouseMoved(object sender, MouseEventArgs e){
if(selectingMode){
//change color of split
}
}
如上所述,每当用户将光标移到该控件上时,就会触发MouseMoved()方法,然后只有在选择模式时才会执行某些操作。有没有办法扭转这种局面?仅在选择模式时触发该事件?
如果我担心一些无关紧要的事情,你能解释一下原因吗?这似乎是一种糟糕的做法,它会使用系统资源(无论多少),特别是考虑到使用这个程序的大部分时间都将花在这个框内的光标上。
感谢和投入,谢谢! 肖恩
答案 0 :(得分:1)
您可能希望使用满足您条件的其他事件:
SplitContainer类:MSDN SplitContainer事件:OnMouseClick
如果您希望仅在点击时触发该事件,请尝试订阅该事件,如果您想要取消订阅某个事件,请使用 - = 标记。
答案 1 :(得分:1)
实施selectingMode
作为属性,并根据true或false将split.MouseMove += new MouseEventHandler(MouseMoved);
或split.MouseMove -= new MouseEventHandler(MouseMoved);
置于setter中。
此外,由于性能原因,我不认为此更改是必要的。