C#防止自定义小部件上的Delete键触发菜单快捷键

C#防止自定义小部件上的Delete键触发菜单快捷键,c#,visual-studio,user-interface,C#,Visual Studio,User Interface,在C#桌面应用程序中,我有一个包含文本框的客户小部件。我在菜单条上还有一个菜单项,它的快捷键是Delete键。我发现,按文本框中的delete键(用户希望删除一个字符)实际上触发了菜单项并删除了他们正在处理的整个对象 有没有办法让文本框在处理按键时出现“第一道裂纹”,而不是菜单项 谢谢。我会将“删除整个对象”菜单项的快捷键更改为Shift-Del或Ctrl-Del…或使用户删除整个对象的工作稍微多一些的东西 如果这不是一个选项,您可以在菜单提示的删除代码中检查表单的ActiveControl,如

在C#桌面应用程序中,我有一个包含文本框的客户小部件。我在菜单条上还有一个菜单项,它的快捷键是Delete键。我发现,按文本框中的delete键(用户希望删除一个字符)实际上触发了菜单项并删除了他们正在处理的整个对象

有没有办法让文本框在处理按键时出现“第一道裂纹”,而不是菜单项


谢谢。

我会将“删除整个对象”菜单项的快捷键更改为Shift-Del或Ctrl-Del…或使用户删除整个对象的工作稍微多一些的东西

如果这不是一个选项,您可以在菜单提示的删除代码中检查表单的ActiveControl,如果是您的文本框,请检查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);
  }
}
if(myTextBox.Text.Length()>0){
int pos=myTextBox.SelectionStart;
string txt=myTextBox.Text;
如果(位置
我会将“删除整个对象”菜单项的快捷键更改为Shift-Del或Ctrl-Del…或使用户删除整个对象的工作稍微多一些的东西

如果这不是一个选项,您可以在菜单提示的删除代码中检查表单的ActiveControl,如果是您的文本框,请检查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);
  }
}
if(myTextBox.Text.Length()>0){
int pos=myTextBox.SelectionStart;
string txt=myTextBox.Text;
如果(位置
您是否在表单级别处理delete键?无论哪种方式,您都可以检查小部件是否具有焦点,然后不处理事件。更好的做法是不要将delete用作全局快捷方式,这似乎与重新指定ctrl+c、alt+f4或tab的操作类似。

您是否在表单级别处理delete键通过这种方式,您可以检查小部件是否具有焦点,然后不处理事件。更好的做法是不使用“删除”作为全局快捷方式,这似乎与重新指定ctrl+c、alt+f4或tab的操作类似。

将表单上的KeyPreview设置为False

Customer小部件可能正在启用它,因此当文本框获得焦点时,您可能必须在表单上禁用KeyPreview(并在失去焦点时重新启用)


否则,从设计器中禁用它应该会起作用。

在表单上将KeyPreview设置为False

Customer小部件可能正在启用它,因此当文本框获得焦点时,您可能必须在表单上禁用KeyPreview(并在失去焦点时重新启用)


否则,从设计器中禁用它应该会起作用。

我们所做的

我们最终使用的解决方案是禁用这些菜单项,从而禁用它们各自的快捷键,当这些菜单项要作用于的控件时

这解决了在不相关的文本框中单击delete(删除)会删除主窗口小部件中的选定项的问题。但是,它引入了一个问题,即用户必须单击主窗口小部件才能访问这些菜单项。为了稍微解决这个问题,我做了一些修改,使主窗口小部件在使用h可识别的小部件是隐藏的

我不是在提倡这个解决方案,只是为了完整性而包含它

我想要的

我的最终解决方案是仅在以下情况下执行操作:

  • 主窗口小部件具有焦点,或者
  • 偶数是通过单击菜单项触发的

  • 但似乎没有办法检测偶数是否由框架内的快捷键触发。

    我们所做的

    我们最终使用的解决方案是禁用这些菜单项,从而禁用它们各自的快捷键,当这些菜单项要作用于的控件时

    这解决了在不相关的文本框中单击delete(删除)会删除主窗口小部件中的选定项的问题。但是,它引入了一个问题,即用户必须单击主窗口小部件才能访问这些菜单项。为了稍微解决这个问题,我做了一些修改,使主窗口小部件在使用h可识别的小部件是隐藏的

    我不是在提倡这个解决方案,只是为了完整性而包含它

    我想要的

    我的最终解决方案是仅在以下情况下执行操作:

  • 主窗口小部件具有焦点,或者
  • 偶数是通过单击菜单项触发的

  • 但是似乎没有办法检测偶数是否是由框架内的快捷键触发的。

    您使用的是WinForms?WPF?其他一些UI库?@LBushkin-我们使用的是WinForms的可能副本您使用的是WinForms吗?WPF?其他一些UI库?@LBushkin-我们使用的是WinForms的可能副本@rbaryyoung-t在调用时,urns out KeyPreview未打开。主菜单必须与主窗体分开获得某种特殊预览权限。@RBarryYoung-在调用时,KeyPreview未打开。主菜单必须与主窗体分开获得某种特殊预览权限。@marr75,I loo越多k在这个问题上,我越是同意使用Delete作为全局快捷方式是一个坏主意;我们必须添加的代码量,以确保我们仅在怀疑客户需要时执行删除操作,这是惊人的。相反,当我们关心的小部件是