【问题标题】:Shortcuts Ctrl+C Ctrl+V dont work in Textboxes if MenuStrip has this Shortcuts set如果 MenuStrip 设置了此快捷方式,则快捷方式 Ctrl+C Ctrl+V 在文本框中不起作用
【发布时间】:2012-02-29 23:35:56
【问题描述】:

目标:带有复制和粘贴功能的菜单条,用户将看到快捷键。

问题:如果您有 MenuStrip 并设置了 ShortcutKeys,则菜单会“捕获”,但文本框不再“捕获”。这意味着您不能在文本框中使用 Ctrl+C / V - 只能通过右键单击。如果您删除快捷方式,则文本框可以正常工作。

这是为什么呢?如果我不想将条目命名为“Copy______Ctrl+C”,解决方案是什么?

示例项目:http://www.file-upload.net/download-4098087/MenuBlocksSTRG.zip.html

MSDN 关闭 ATM 我找到了这个链接:

【问题讨论】:

  • 通常您会将执行复制/粘贴的代码绑定到这些菜单项。
  • @JoeWhite 您的链接是关于 WPF,问题是关于 WinForms。
  • 我认为这个问题是相关的:stackoverflow.com/questions/5113722/…
  • @CodeInChaos 哎呀,你说得对,我没有仔细阅读关于MenuStrip 的内容。
  • 更好:myMenuItem.Text = "&Copy\tCtrl+C";

标签: c# winforms keyboard-shortcuts shortcuts menustrip


【解决方案1】:

这应该适用于复制,你可以用同样的方式来处理粘贴:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.C) && textBox1.ContainsFocus)
        {
            Clipboard.SetText(textBox1.SelectedText);
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

【讨论】:

  • 构建剪贴板很麻烦。如果光标不是在文本框的开头而是在文本的中间开始怎么办。如果选择要复制或替换某些文本怎么办。我选择将菜单文本设置为“复制 Ctrl+C”
  • 这适用于所有情况下的复制(包括您所说的那种),它将文本框中的选定文本放入剪贴板。你试过了吗?如果不能按照这个思路做粘贴,请报告,我会写一些代码。如果您认为这很麻烦,您要求解决 .net 的工作方式。这很麻烦。
  • 优秀的解决方案。尽管我将检查更改为更通用的this.ActiveControl is TextBox,因为我的程序的其余部分是图像编辑器:)
【解决方案2】:

如果它仍然很重要,简单的解决方案可能是: 仅显示快捷键文本,如图所示。

在 TextBox 中将 ShortcutsEnabled 设置为 true。就是这样!

【讨论】:

    【解决方案3】:

    在这些情况下,您可能必须自己处理。

    简单示例:

    private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
      if (this.ActiveControl is TextBox) {
        Clipboard.SetText(((TextBox)this.ActiveControl).SelectedText);
      } else {
        // do your menu Edit-Copy code here
      }
    }
    
    private void pasteToolStripMenuItem_Click(object sender, EventArgs e) {
      if (this.ActiveControl is TextBox) {
        ((TextBox)this.ActiveControl).SelectedText = Clipboard.GetText();
      } else {
        // do you menu Edit-Paste code here
      }
    }
    

    【讨论】:

    • 构建剪贴板很麻烦。如果光标不是在文本框的开头而是在文本的中间开始怎么办。如果选择要复制或替换某些文本怎么办。我选择将菜单文本设置为“复制 Ctrl+C”
    • 您是否尝试过应用答案中的代码,或者您只是说这很麻烦?因为,你会意识到这不是你的答案,它要求当你的菜单被点击时,它会从你的文本框中处理复制或粘贴,这不是你的菜单应该起作用的。
    • @user799821 不确定您的意思。发布的示例为您完成了工作。 SelectedText 属性返回文本框中当前突出显示的内容。代码的“else”部分是处理非文本框控件的复制粘贴功能。如果菜单功能仅适用于文本框控件,那么您不必担心“else”部分。
    • 不过,这会使菜单不直观,因为人们希望这些菜单能够处理程序通常处理的任何内容的全局复制粘贴,而不是文本框中的内容。
    【解决方案4】:

    你需要这样的东西吗?

    ToolStripMenuItem Quit = new ToolStripMenuItem();
            Quit.Name = "quitToolStripMenuItem";
            Quit.Text = "&Quit";
            Quit.ShortcutKeys = Keys.Alt | Keys.F4;
            Quit.Click += new EventHandler(quitToolStripMenuItem_Click);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多