自定义 RichTextBox OnKeyDown 覆盖不起作用
Custom RichTextBox OnKeyDown override doesn't work
我有这个 class 由 RichTextBox 继承。我覆盖了 void OnKeyDown
来检查传入的标签,因为我不想要它们。
使用断点,我看到调用了覆盖的 void,但它没有完成它的工作。
代码如下:
class ProgrammingTextBox : RichTextBox
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Tab)
{
// Tab was pressed, replace it with space
e.SuppressKeyPress = true; // Don't press Tab
for (int i = 0; i < 4; i++)
{
base.OnKeyDown(new KeyEventArgs(Keys.Space); // Repeat space 4 times
}
}
else base.OnKeyDown(e);
}
}
想要的输出应该是包含 4 个空格的文本,但结果是一个制表符,就像 for
循环中的 OnKeyDown
调用没有被调用。
知道我该怎么做吗?
当使用 Tab
(它不是 普通键 - 它可以被预处理并移动焦点控制)时,你必须覆盖 不同的方法,ProcessCmdKey
:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspx
像这样
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Tab) {
//TODO: Your code here
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
另见
https://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.acceptstab.aspx
base.OnKeyDown(new KeyEventArgs(Keys.Space);
OnKeyDown() onKeyPress() 仅生成通知,它们的工作不是修改文本属性。由您决定,分配 SelectedText 属性。像这样:
class ProgrammingTextBox : RichTextBox {
protected override bool IsInputKey(Keys keyData) {
if (keyData == Keys.Tab) return true;
return base.IsInputKey(keyData);
}
protected override void OnKeyDown(KeyEventArgs e) {
if (e.KeyCode == Keys.Tab) {
const string tabtospaces = " ";
var hassel = this.SelectionLength > 0;
this.SelectedText = tabtospaces;
if (!hassel) this.SelectionStart += tabtospaces.Length;
e.SuppressKeyPress = true;
}
else base.OnKeyDown(e);
}
}
我有这个 class 由 RichTextBox 继承。我覆盖了 void OnKeyDown
来检查传入的标签,因为我不想要它们。
使用断点,我看到调用了覆盖的 void,但它没有完成它的工作。
代码如下:
class ProgrammingTextBox : RichTextBox
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Tab)
{
// Tab was pressed, replace it with space
e.SuppressKeyPress = true; // Don't press Tab
for (int i = 0; i < 4; i++)
{
base.OnKeyDown(new KeyEventArgs(Keys.Space); // Repeat space 4 times
}
}
else base.OnKeyDown(e);
}
}
想要的输出应该是包含 4 个空格的文本,但结果是一个制表符,就像 for
循环中的 OnKeyDown
调用没有被调用。
知道我该怎么做吗?
当使用 Tab
(它不是 普通键 - 它可以被预处理并移动焦点控制)时,你必须覆盖 不同的方法,ProcessCmdKey
:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspx
像这样
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Tab) {
//TODO: Your code here
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
另见
https://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.acceptstab.aspx
base.OnKeyDown(new KeyEventArgs(Keys.Space);
OnKeyDown() onKeyPress() 仅生成通知,它们的工作不是修改文本属性。由您决定,分配 SelectedText 属性。像这样:
class ProgrammingTextBox : RichTextBox {
protected override bool IsInputKey(Keys keyData) {
if (keyData == Keys.Tab) return true;
return base.IsInputKey(keyData);
}
protected override void OnKeyDown(KeyEventArgs e) {
if (e.KeyCode == Keys.Tab) {
const string tabtospaces = " ";
var hassel = this.SelectionLength > 0;
this.SelectedText = tabtospaces;
if (!hassel) this.SelectionStart += tabtospaces.Length;
e.SuppressKeyPress = true;
}
else base.OnKeyDown(e);
}
}