2015-03-08 57 views
0

我正试图在用户界面中实现一个命令行工具RichTextBox。我试图限制使用类似于MS Dos命令提示窗口的Left and Right arrow keys。我的实现不应该允许用户跨越当前的根目录。光标位置不停止在根目录下:winforms RichTextBox

e.g.

C:\Test>如果是根,用户不应该被允许穿过'>'与左箭头键。

下面是我的代码:

richTextbox1.KeyDown += OnKeyDown; 
string root = "C:\Test>"; 

void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.KeyCode) 
    { 
     case Keys.Left: 
     case Keys.Right: 
     { 
      int lastline = richTextbox1.Lines.Length - 1; 
      int first = richTextbox1.GetFirstCharIndexFromLine(lastline); 
      int valid = first + root.Length + 1; 

      if (richTextbox1.SelectionStart < valid) 
      { 
       richTextbox1.Select(valid, 0); 
       richTextbox1.Invalidate(); 
      } 
     } 
     break; 
    } 
} 

它适用于情况: C:\Test>xyz:当用户保持按压left arrow,他/她不能超越>字符

失败案例: C:\Test>:当用户一直按left arrow,他/她可以超出>字符,并停止在t

我的代码有什么问题,我无法弄清楚?

+1

您可以使用'e.Handled = true;'取消关键笔划。但这是一些蛇坑。 'home','(control-)backspace','shift-left/right'(也许更多)呢? – 2015-03-08 22:53:28

+0

是的我可以使用'e.Handled = true;'但是我应该在什么情况下取消键击?所有其他密钥也需要处理。 “左”和“右”键是我的第一个目标。 – Neo 2015-03-09 00:35:39

+1

是的,使用e.Handled,仅用于左键。并使用SelectionProtected属性来防止用户使用退格删除“root”。 – 2015-03-09 03:32:36

回答

0

非常好,它适用于e.Handled = true,工作代码如下: richTextbox1.KeyDown + = OnKeyDown; string root =“C:\ Test>”;

void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.KeyCode) 
    { 
     case Keys.Left: 
     case Keys.Right: 
     { 
      int lastline = richTextbox1.Lines.Length - 1; 
      int first = richTextbox1.GetFirstCharIndexFromLine(lastline); 
      int valid = first + root.Length + 1; 

      if (richTextbox1.SelectionStart < valid) 
      { 
       //richTextbox1.Select(valid, 0); 
       //richTextbox1.Invalidate(); 
       e.Handled = true; 
      } 
     } 
     break; 
    } 
}