正确使用KeyDown事件

时间:2014-03-06 20:31:19

标签: 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" ||
       TextBox.Text == "Mobile number" ||
       TextBox.Text == "Password")
   {
       TextBox.Foreground = new SolidColorBrush(Colors.Black);

       TextBox.Text = e.Key.ToString().ToLower();
       TextBox.Select(1, 0);
   }
}

我的TextBox最初将标签设置为.Text属性。当用户点击TextBox时,我希望光标移动到开头,然后当他们开始输入标签时消失。

这是正常的,但问题是当我点击零时,TextBox填充“D0”。它也没有正确处理外壳,这就是我添加ToLower调用的原因。我只想让TextBox清除自己,然后用正确的大小写显示用户点击的内容。其他如何无法正常工作的示例是,如果我点击空格键,它将显示“空格”。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果我理解正确 - “我只是希望TextBox清除自己,然后用正确的大小写显示用户点击的内容。” - 您不需要处理KeyDown事件。尝试使用GotFocus insted:

myTextBox.GotFocus += (s, e) =>
{
    myTextBox.Text = "";
};

当用户开始输入时,上面的这个简单代码将清除该字段。您无需处理KeyDown - 当用户按下键时,TextBox会自动填充。

BTW - 使用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;
    }
}

答案 1 :(得分:0)

    private bool ClearTextBox = false;
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox tbSender = (TextBox)sender;

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

            tbSender.Select(0, 0);
            tbSender.SelectionStart = 0;

            ClearTextBox = true;
        }
        else
        {
            tbSender.Select(tbSender.Text.Length, 0);
        }
    }


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

        if (ClearTextBox)
        {
            tbSender.Foreground = new SolidColorBrush(Colors.Black);

            tbSender.Text = tbSender.Text.Substring(0, 1);

            tbSender.SelectionStart = 1;

            ClearTextBox = false;
        }
    }

感谢您的帮助Romasz和您的代码示例,它解决了我的初始问题所以现在如果我点击空格或零,它将用''或'0'填充文本框,很棒。

我遇到的唯一问题是如果我按shift(或返回那个问题)来获得大写键盘(如果我在文本框中键入标签'Name'),它会清除文本框但显示一个资本'N'。我会继续努力。再次感谢。

修改

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

        string KeyString = e.Key.ToString();

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