在Winform中我们可以通过在按钮的名称上使用&来给按钮设置热键。但是如果多个按钮有相同的热键时会发生什么呢?我们来做个实验。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、成都网站设计、外贸营销网站建设、大兴网络推广、成都微信小程序、大兴网络营销、大兴企业策划、大兴品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;创新互联为所有大学生创业者提供大兴建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com我们放三个按钮并设置同样的热键,然后在每个按钮的处理函数里使用MessageBox.Show来输出自己的名称,以此来说明哪个按钮被触发了。
运行程序后,按Alt+b你会发现弹出了button2的提示,按确定后没再有别的提示。如下图:
这时你再让button2获取焦点后再按Alt+b试试,你会收到button3的提示。由此可以得出,Winform是根据当前的焦点位置和Tab顺序来搜索下一个可触发热键的控件来处理的。要注意的是搜索的顺序是从当前焦点的下一个控件开始到当前焦点的控件为止来搜索。
我们再做一个试验,新建一个用户控件,在这个用户控件中我们添加一个按钮,并将热键设置为Alt+b。在后台添加一个Sequence属性,在控件的Load事件中将button的名称上加上Sequence的值,在按钮的Click事件中Show出按钮的名称以表示哪个按钮被触发。
用户控制做好后我们将它添到我们的form上,放三个并依次将Sequence属性改为1,2,3。
运行后,我们将焦点定位到ucbutton1上后按Alt+b,你会发现提示uc&button1的消息。ucbutton2和uc&button3也是如此。
那为什么会这样呢?是不是Usercontorl有不同的处理呢?我们再来做个实验吧。再新建一个用户控件,添加3个按钮设置相同的热键,并添加后台方法如下:
再将这个用户控件添加到窗体中。
运行程序后把焦点置于button3后按Alt+b你会收到uc2button1的提示,通过上面的结论这个是正确的。当你把焦点置于uc2button1时按Alt+b你会收到uc2button2的提示,当你把焦点置于uc2button3上时按Alt+b你会收到uc2button1的提示。
所以可以得出结论了。当焦点进入usercontrol之后Winform搜索下一个可触发控件的范围就限定在这个用户控件内了。现在也可以理解第二个实验为会ucbutton1~3会触发当前按钮的原因了,因为在用户控件的范围内只有一个热键为Alt+b的控件。
不过我们正常情况下是不会遇到这个问题的,我是在一个form上加载多次同一个用户控件时才遇到这个问题的。个人认为我们不应该依赖于Winform的这种搜索机制,而是自己多加处理来控制热键的触发逻辑,如通过Enable或Visable来保证热键不冲突。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。