【问题标题】:WinForms ReadOnly TextBox Ctrl-R key downWinForms ReadOnly TextBox Ctrl-R 按下
【发布时间】:2014-12-01 16:53:55
【问题描述】:

我有一个 C# WinForms 示例应用程序,演示了有趣的密钥处理问题。 这很简单:上面只有一个Form 和TextBox。我将TextBox ReadOnly 属性设置为true。

我的Form 中有下一个代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData.HasFlag(Keys.R))
        {
            MessageBox.Show("There is 'R' key in KeyDown event");
        }
    }
}

当我按下 Ctrl-R 键时,MessageBox 不显示。但是,如果我将TextBox 的ReadOnly 属性设置为true,则会出现MessageBox。当我在ReadOnly TextBox 上按 Shift-R 或 Alt-R 时,也会发生同样的事情.

任何想法,ReadOnly TextBox 和 Ctrl-R 组合有什么特别之处?

【问题讨论】:

  • 它还在w、v、z、[、s、'、v上显示消息框
  • @Shaharyar,我知道,但这只是说明问题。 if (e.Control && e.KeyCode == Keys.R) 也不起作用。

标签: c# .net winforms textbox keyboard-shortcuts


【解决方案1】:

您可能会查看ShortCutsEnabled 属性。

正如在这篇文章中已经看到的那样:Why are some textboxes not accepting Control + A shortcut to select all by default

【讨论】:

  • ShortCutsEnabled 属性没有帮助。
【解决方案2】:

对于 CTRL+R 组合

private void KeyDown(object sender, KeyEventArgs e)
{
  if (e.Control && e.KeyCode == Keys.R)
  {
    //your code
  }
}

【讨论】:

  • 这没有帮助。比方说,适用于 Shift-R,但不适用于 Ctrl-R。
  • 什么意思?当然,如果用户按 CTRL+R 而不是 Shift+R,上面的代码将起作用。如果你想包含 Shift 你可以使用e.Shift && e.KeyCode == Keys.R)
  • 我的意思是如果你设置TextBoxReadOnly = true,if (e.Control && e.KeyCode == Keys.R)不适用于Ctrl-R,但e.Shift && e.KeyCode == Keys.R)适用于Shift-R。
  • 我明白了。这里的另一个选项是将您的 KeyDown 事件转移到 Form_KeyDown(object sender, KeyEventArgs e) 并设置表单属性 KeyPreview = true
【解决方案3】:

这似乎是一个已知问题。你得问微软为什么…… http://social.msdn.microsoft.com/Forums/en-US/941c9759-5531-49fe-9ebb-7fc6d812b0fd/ctrle-not-working-in-a-read-only-text-box?forum=csharplanguage

一般建议:如果您想检测特定的字符,请使用KeyPress()。从键盘按键转换为字符集后调用。

private void textBox1_KeyPress(Object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'R')
        MessageBox.Show("Hit an 'R'");
}

要处理键盘“快捷键”,请更改测试:

if (ModifierKeys == Keys.Control && e.KeyChar == 'R')

【讨论】:

  • 谢谢,这是一个很好的观点。但我需要处理键盘快捷键。 KeyDown 更适合此目的。
  • 两者都不比其他更好,只要适合您选择的处理程序的方法即可。同样,它归结为想要物理键盘键而不是 字符。
【解决方案4】:

TextBoxBase.ProcessCmdKey() method 中有一个补丁,它修复了在设置控件的 ReadOnly 属性时某些快捷键仍然修改文本的问题。它们是 Ctrl+R、Ctrl+J、Ctrl+E 和 Ctrl+L。

Afaik,这个补丁有点太粗糙了,应该只适用于 RichTextBox。

通过覆盖 TextBox 类并恢复这些键的正常行为可以解决此问题。向您的项目添加一个新类并粘贴如下所示的代码。编译。从工具箱顶部删除新控件,替换原来的文本框。

using System;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == (Keys.Control | Keys.R) ||
            keyData == (Keys.Control | Keys.L) ||
            keyData == (Keys.Control | Keys.E) ||
            keyData == (Keys.Control | Keys.J)) return false;
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

【讨论】:

  • 小编辑:我在该检查中添加了 ReadOnly && keyData == (Keys.Control | Keys.R)..
  • 这实际上不是必需的,但是唉。
  • 这并不能解决菜单快捷方式的问题,因为它们应该由它来处理。
  • 我发现的唯一解决方法是同时使用这个替换的 TextBox 和 来捕获我的文本框上的 KeyDown 事件,过滤掉源是设置了 ReadOnly 的 TextBox 的调用,以及然后为该特定组合键调用菜单功能(在我的情况下为 Ctrl+E)。
猜你喜欢
  • 2014-11-07
  • 2013-08-05
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多