C# 正确使用KeyDown事件

C# 正确使用KeyDown事件,c#,windows-phone-8,textbox,C#,Windows Phone 8,Textbox,我有以下功能: private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { TextBox TextBox = (TextBox)sender; if (TextBox.Text == "Name" || TextBox.Text == "E-mail address" || TextBox.Text == "Confirm e-mail" ||

我有以下功能:

private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
   TextBox TextBox = (TextBox)sender;

   if (TextBox.Text == "Name" ||
       TextBox.Text == "E-mail address" ||
       TextBox.Text == "Confirm e-mail" ||
       TextBox.Text == "Mobile number" ||
       TextBox.Text == "Password")
   {
       TextBox.Foreground = new SolidColorBrush(Colors.Black);

       TextBox.Text = e.Key.ToString().ToLower();
       TextBox.Select(1, 0);
   }
}
我的文本框最初将一个标签设置为其.Text属性。当用户点击文本框时,我希望光标移到开头,然后当他们开始键入时,标签消失

这工作正常,但问题是当我点击零时,文本框中填充了“D0”。它也不能正确处理外壳,这就是我添加ToLower调用的原因。我只想让文本框自己清除,然后用正确的大小写显示用户点击的内容。它工作不正常的其他例子是,如果我点击空格键,它会显示“空格”


有什么想法吗?

如果我正确理解了您的意思-“我只想让文本框自行清除,然后用正确的大小写准确显示用户点击的内容。”-您不需要处理
按键事件。尝试使用所安装的
GotFocus

myTextBox.GotFocus += (s, e) =>
{
    myTextBox.Text = "";
};
当用户开始键入时,上面的简单代码将清除该字段。您不需要处理
向下键
-当用户按键时,文本框会自动填充

顺便说一句,使用TextBox作为TextBox的名称是一种非常糟糕的做法

编辑-评论后

那么这就足够了:

private bool toClear = false;
public MainPage()
{
    InitializeComponent();
    myTextBox.GotFocus += (s, e) =>
       {
         myTextBox.SelectionStart = 0;
         toClear = true;
       };
    myTextBox.KeyUp+=myTextBox_KeyUp;
}

private void myTextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (toClear)
    {
        myTextBox.Text = myTextBox.Text.Substring(0, 1);
        myTextBox.SelectionStart = 1;
        toClear = false;
    }
}
感谢您的帮助Romasz和您的代码示例,它修复了我最初的问题,因此现在如果我点击空格或零,它将用“”或“0”填充文本框,非常好

我唯一的问题是,如果我按shift键(或按return键)获取大写键盘(如果我在标签为“Name”的文本框中键入),它会清除文本框,但会显示大写字母“N”。我会继续努力的。再次感谢

编辑

这似乎已经修复了它,添加到KeyUp事件中

        string KeyString = e.Key.ToString();

        if (KeyString == "Shift" || KeyString == "Enter")
        {
            return;
        }

谢谢,但我不能这样做,因为当文本框获得焦点时,我仍然希望显示标签。因此,在他们开始输入之前,“名称”文本框仍将包含名称,这时我需要清除它。为什么这是如此糟糕的做法?这并没有让我感到困惑,这意味着我的变量仍然是大写的。这是一种不好的做法,因为你可能会有很多文本框,这会让你感到困惑。我对文本框使用的标准做法是在文本框包含的任何内容的前面附加“tb”。例如,tbName、tbEmail、tbPhone等……这样就没有混淆的余地,您知道它是什么类型的控件,以及其中包含的数据的一般类型。@xceed所以我添加了一个编辑,它应该适合您的需要。TextBox是类的一种类型,应该像它一样使用,否则您将看到in会在代码中产生很多混乱。请注意,一个类可以有一个静态方法/变量,您将访问MyClass.variable-您不需要对象来访问它。它将解决下一个问题,因为它将防止TexBox被清除(您还应该处理其他键)。如果(e.Key==Key.Shift | | e.Key==Key.Enter)返回,就可以做得更简单:
。很高兴你能解决所有的问题。当它可用时,别忘了将答案标记为解决方案,这样它就不会再无法解决。谢谢,这样更好。
        string KeyString = e.Key.ToString();

        if (KeyString == "Shift" || KeyString == "Enter")
        {
            return;
        }