Winform对多个按钮相同热键时的处理

在Winform中我们可以通过在按钮的名称上使用&来给按钮设置热键。但是如果多个按钮有相同的热键时会发生什么呢?我们来做个实验。

创新互联公司是一家集成都做网站、网站建设、网站页面设计、网站优化SEO优化为一体的专业网络公司,已为成都等多地近百家企业提供网站建设服务。追求良好的浏览体验,以探求精品塑造与理念升华,设计最适合用户的网站页面。 合作只是第一步,服务才是根本,我们始终坚持讲诚信,负责任的原则,为您进行细心、贴心、认真的服务,与众多客户在蓬勃发展的市场环境中,互促共生。

我们放三个按钮并设置同样的热键,然后在每个按钮的处理函数里使用MessageBox.Show来输出自己的名称,以此来说明哪个按钮被触发了。

Winform 对多个按钮相同热键时的处理

Winform 对多个按钮相同热键时的处理

运行程序后,按Alt+b你会发现弹出了button2的提示,按确定后没再有别的提示。如下图:

Winform 对多个按钮相同热键时的处理

这时你再让button2获取焦点后再按Alt+b试试,你会收到button3的提示。由此可以得出,Winform是根据当前的焦点位置和Tab顺序来搜索下一个可触发热键的控件来处理的。要注意的是搜索的顺序是从当前焦点的下一个控件开始到当前焦点的控件为止来搜索。

我们再做一个试验,新建一个用户控件,在这个用户控件中我们添加一个按钮,并将热键设置为Alt+b。在后台添加一个Sequence属性,在控件的Load事件中将button的名称上加上Sequence的值,在按钮的Click事件中Show出按钮的名称以表示哪个按钮被触发。

Winform 对多个按钮相同热键时的处理

Winform 对多个按钮相同热键时的处理

用户控制做好后我们将它添到我们的form上,放三个并依次将Sequence属性改为1,2,3。

Winform 对多个按钮相同热键时的处理

运行后,我们将焦点定位到ucbutton1上后按Alt+b,你会发现提示uc&button1的消息。ucbutton2和uc&button3也是如此。

Winform 对多个按钮相同热键时的处理

那为什么会这样呢?是不是Usercontorl有不同的处理呢?我们再来做个实验吧。再新建一个用户控件,添加3个按钮设置相同的热键,并添加后台方法如下:

Winform 对多个按钮相同热键时的处理

Winform 对多个按钮相同热键时的处理

再将这个用户控件添加到窗体中。

Winform 对多个按钮相同热键时的处理

运行程序后把焦点置于button3后按Alt+b你会收到uc2button1的提示,通过上面的结论这个是正确的。当你把焦点置于uc2button1时按Alt+b你会收到uc2button2的提示,当你把焦点置于uc2button3上时按Alt+b你会收到uc2button1的提示。

所以可以得出结论了。当焦点进入usercontrol之后Winform搜索下一个可触发控件的范围就限定在这个用户控件内了。现在也可以理解第二个实验为会ucbutton1~3会触发当前按钮的原因了,因为在用户控件的范围内只有一个热键为Alt+b的控件。

不过我们正常情况下是不会遇到这个问题的,我是在一个form上加载多次同一个用户控件时才遇到这个问题的。个人认为我们不应该依赖于Winform的这种搜索机制,而是自己多加处理来控制热键的触发逻辑,如通过Enable或Visable来保证热键不冲突。


标题名称:Winform对多个按钮相同热键时的处理
本文链接:http://ybzwz.com/article/gpdojo.html