1

:) 我正在制作一个 C# 打字程序,我希望用户在输入错误的字母时无法输入任何内容,(我希望打字光标冻结在其位置)并且当他按下退格键时,只有这样他才能继续他的打字。

我通过操作 ConsoleScreenCursorCoordinates 在 C++ 中完成了这个程序,我尝试通过操作 textBox.Location 在 C# 中做同样的事情,但它没有用。

在我的程序中,有 2 个文本框,sourceTextBox 和 TypingTextBox 还有一个名为“文本”的字符串变量,它将通过 StreamReader 从文本文件中读取,然后我使用这个文本变量将其中的每个元素与用户的内容进行比较在打字。

我厌倦了这个:

bool madeMistake = false;
Point CurrentTypingPosition;
string whatIsWrittenBeforeTheMistake = "";

private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
     try
     {
       if (!madeMistake)
       {
           if (e.KeyChar == text[typingIndex])
           {
               typingIndex++;
           }
           else if (e.KeyChar == backspace)
           {
               typingIndex--;
           }
           else
           {
               CurrentTypingPosition = TypingTextBox.Location;
               madeMistake = true;
               TypingTextBox.Text += " ";
               TypingTextBox.Location = CurrentTypingPosition;
               whatIsWrittenBeforeTheMistake = TypingTextBox.Text;
           }
       }
       else
       {

           if (e.KeyChar == backspace)
               madeMistake = false;
           else
           {
               TypingTextBox.Text = whatIsWrittenBeforeTheMistake;
               TypingTextBox.Location = CurrentTypingPosition;
           }
        }
     }
     catch (Exception ex)
     {
       MessageBox.Show(ex.Message);
     }
   }
}
4

4 回答 4

2

另一种更强大的解决方法是创建一个自定义 TextBox,继承自 TextBox 本身。然后,您将能够处理 KeyDown (PreviewKeyDown) 事件等,并在每次击键时确定是否有问题。如果无效,您可以将 KeyEventArgs (e.Handled) 设置为 true,并阻止进一步的用户输入(除了退格,您可以检查)。

这避免了必须挂钩文本框事件,如果使用 MVVM,这是可取的。如果您需要非常精细的控制,您可以使用此方法。

于 2012-07-16T17:47:16.500 回答
2

另一个变体是使用事件 args 的Handled属性KeyPress,所以你会得到类似的东西:

void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{

    if (Char.IsControl(e.KeyChar))
    {
        e.Handled = false;
        return;
    }

    char expectedNext = expected[textBox1.SelectionStart];

    if (expectedNext != e.KeyChar)
    {
        e.Handled = true;
        Console.WriteLine("Incorrect input");
    }
}
于 2012-07-16T17:52:49.883 回答
1

这对你有用吗?

    private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        ...
        if (madeMistake)
            TypingTextBox.ReadOnly = true;
        ...
    }
于 2012-07-16T17:39:13.013 回答
0

您将不得不调整它以使用您的 StreamReader 对象代替我在这里使用的字符数组,但这会起作用,但不需要它们必须退格。

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {            
        char[] charArr = { 'a', 'b', 'c' };  //spec out what is acceptable here

        foreach (char c in charArr)
        {
            if (e.KeyChar.CompareTo(c) > 0)
            {
                e.Handled = true;                    
            }
            else
            {
                e.Handled = false;
            }
        }
    }
于 2012-07-16T18:12:04.493 回答