如何在显示之前从 C#.net WPF 文本框中删除字符?
How can I remove a character from a C#.net WPF textbox before it's shown?
我在 C#.net 中有一个项目使用 WPF 文本框验证输入的第一个字符如 *。如果输入这个字符,文本的其余部分是好的,但我无法显示或使用该字符。如何尽早从字符串中删除字符而不显示它?我已尝试使用 KeyDown 事件,但当事件处于活动状态时,没有要删除的数据。如果我使用 KeyUp 事件,数据会显示一秒钟。我以前在 VB6 中使用过 KeyPress 事件来实现这一点,因为该值同时在代码中而不是在文本框中。据我所知,WPF 文本框没有此事件。我能做什么?
代码:
private void UserInput_KeyUp(object sender, KeyEventArgs e)
{
//get ascii value from keyboard input
int Ascii = (int)e.Key;
//get char value to know what to remove as a string
char CharAscii = (char)Ascii;
If(Ascii == InputPrefix)
{
PrefixValidated = true;
UserInput.Text = UserInput.Text.Replace(CharAscii.ToString(), string.Empty);
}
}
相同的代码在 KeyDown 事件中,我已经尝试使用一个或另一个以及两者。
这可能是一个粗略的解决方案,但我相信您可以使用 PreviewTextInupt 事件。
private bool PrefixValidated = false;
private string CheckUserInput;
private void TextBox1_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
CheckUserInput = CheckUserInput + e.Text;
if (CheckUserInput.ElementAt(0).ToString() == "*" && e.Text != "*")
{
e.Handled = false;
}
else if (CheckUserInput.ElementAt(0).ToString() == "*")
{
PrefixValidated = true;
e.Handled = true;
}
else
{
e.Handled = true;
}
}
感谢 Dark Templar 帮助发现此解决方案。使用 PreviewTextInput 并仅在文本框中没有其他字符时才验证字符似乎给出了正确的结果。
设置 e.Handled = true 会阻止字符实际进入文本框,哪怕只有一秒钟,这样用户就永远不会知道前缀。
代码:
private void UserInput_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
//if this is the first character entered, the textbox is not yet populated
//only perform validation if the character is a prefix
if (UserInput.Text != "")
return;
char CharAscii = (char)ScannerPrefix;
if (e.Text == CharAscii.ToString())
{
PrefixValidated = true;
e.Handled = true;
}
}
我在 C#.net 中有一个项目使用 WPF 文本框验证输入的第一个字符如 *。如果输入这个字符,文本的其余部分是好的,但我无法显示或使用该字符。如何尽早从字符串中删除字符而不显示它?我已尝试使用 KeyDown 事件,但当事件处于活动状态时,没有要删除的数据。如果我使用 KeyUp 事件,数据会显示一秒钟。我以前在 VB6 中使用过 KeyPress 事件来实现这一点,因为该值同时在代码中而不是在文本框中。据我所知,WPF 文本框没有此事件。我能做什么?
代码:
private void UserInput_KeyUp(object sender, KeyEventArgs e)
{
//get ascii value from keyboard input
int Ascii = (int)e.Key;
//get char value to know what to remove as a string
char CharAscii = (char)Ascii;
If(Ascii == InputPrefix)
{
PrefixValidated = true;
UserInput.Text = UserInput.Text.Replace(CharAscii.ToString(), string.Empty);
}
}
相同的代码在 KeyDown 事件中,我已经尝试使用一个或另一个以及两者。
这可能是一个粗略的解决方案,但我相信您可以使用 PreviewTextInupt 事件。
private bool PrefixValidated = false;
private string CheckUserInput;
private void TextBox1_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
CheckUserInput = CheckUserInput + e.Text;
if (CheckUserInput.ElementAt(0).ToString() == "*" && e.Text != "*")
{
e.Handled = false;
}
else if (CheckUserInput.ElementAt(0).ToString() == "*")
{
PrefixValidated = true;
e.Handled = true;
}
else
{
e.Handled = true;
}
}
感谢 Dark Templar 帮助发现此解决方案。使用 PreviewTextInput 并仅在文本框中没有其他字符时才验证字符似乎给出了正确的结果。
设置 e.Handled = true 会阻止字符实际进入文本框,哪怕只有一秒钟,这样用户就永远不会知道前缀。
代码:
private void UserInput_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
//if this is the first character entered, the textbox is not yet populated
//only perform validation if the character is a prefix
if (UserInput.Text != "")
return;
char CharAscii = (char)ScannerPrefix;
if (e.Text == CharAscii.ToString())
{
PrefixValidated = true;
e.Handled = true;
}
}