在C#桌面应用程序中,我有一个包含文本框的客户窗口小部件。我还在菜单条上有一个菜单项,其中包含Delete键作为其快捷键。我发现的行为是在文本框中按删除,用户希望删除一个字符,实际上是触发菜单项并删除他们正在处理的整个对象。
有没有办法让文本框在处理按键而不是菜单项时有“第一次破解”?
感谢。
答案 0 :(得分:1)
我会将“删除整个事物”菜单项的快捷键更改为Shift-Del或Ctrl-Del ...或者使用户删除整个对象的更多功能。
如果这不是一个选项,您可以在MenuStrip的删除代码中检查表单的ActiveControl,如果它是您的TextBox,请检查Textbox.SelectionStart值以获取文本中光标的位置并手动删除该字符:
if (myTextBox.Text.Length() >0) {
int pos = myTextBox.SelectionStart;
string txt = myTextBox.Text;
if (pos < txt.Length()) {
myTextBox.Text = txt.Substring(0,txt.Substring(0, pos-1) + txt.substring(pos+1);
}
}
答案 1 :(得分:1)
您是否在表单级别处理删除键?无论哪种方式,您都可以检查具有焦点的窗口小部件,然后不处理该事件。更好的方法是不使用删除作为全局快捷方式,这似乎是重新分配ctrl + c,alt + f4或tab的内容。
答案 2 :(得分:1)
我们做了什么
我们最终使用的解决方案是禁用这些菜单项,从而在对这些菜单项的控制措施进行操作时禁用其各自的快捷键。
这解决了在不相关的文本框中单击删除删除主窗口小部件中的选定项目的问题。但是,它引入了用户必须单击主窗口小部件才能访问这些菜单项的问题。为了解决这个问题,我确实做了这样的事情,当隐藏了可隐藏小部件的面板时,主小部件重新获得了焦点。
我不是在提倡这个解决方案,只是为了完整性而包含它。
我会喜欢什么
我的最终解决方案是仅在以下情况下执行操作:
但似乎没有办法检测偶数是否由框架内的快捷键触发。
答案 3 :(得分:0)
在表单上将KeyPreview设置为False。
Customer Widget可能正在打开它,因此您可能必须在文本框获得焦点时禁用表单上的KeyPreview(并在失去焦点时重新启用它)。
否则,从设计器中禁用它应该有效。