如何在显示之前从 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;
        }
    }