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

发布时间:2020-06-19 06:45:11 作者:arthurshan
来源:网络 阅读:788

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

我们放三个按钮并设置同样的热键,然后在每个按钮的处理函数里使用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来保证热键不冲突。

推荐阅读:
  1. 2.WinForm练习--按钮控件:DoYouLoveMe
  2. 1.WinForm练习--按钮控件:窗体之间的跳转

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

winform hotkey fo

上一篇:一个区分不同设备的脚本

下一篇:C#实现计算器

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》