如何在TextBox中书写时自动添加点

本文关键字:添加 书写 TextBox | 更新日期: 2023-09-27 17:57:57

我有一个绑定在DateTime类型上的TextBox。我需要在前两个字符和后两个字符后面加一个点,例如:12.12.1990。我在TextChanged事件中使用行为,代码为:

void tb_TextChanged(object sender, TextChangedEventArgs e)
{
    int i = tb.SelectionStart;
    if (i == 2 || i == 5)
    {                
        tb.Text += ".";
        tb.SelectionStart = i + 1;
    }
}

这是有效的,但若我想通过退格删除文本,显然我不能删除点,因为事件会被再次调用。

解决问题的更好方法是什么?

已解决

它有效但如果可以的话,你可以修改我的算法。

        public string oldText = "";
        public string currText = "";
        private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            oldText = currText;
            currText = TextBox1.Text;
            if (oldText.Length > currText.Length)
            {
                oldText = currText;
                return;
            }
            if (TextBox1.Text.Length == currText.Length)
            {
                if (TextBox1.SelectionStart == 2 || TextBox1.SelectionStart == 5)
                {
                    TextBox1.Text += ".";
                    TextBox1.SelectionStart = TextBox1.Text.Length;
                }
            }
        }

如何在TextBox中书写时自动添加点

我会在KeyPress事件中进行,这样你就可以根据它是哪种键进行筛选(使用带有Char.IsLetter()和类似函数的KeyChar参数)。

此外,按下下一个键时添加点。如果用户输入了"12",则不要添加点。当用户按1添加第二个"12"时,请添加它(在新字符之前)。

在xaml控件中使用字符串格式,如

StringFormat='{}{0:dd.MM.yyyy}'

我刚刚测试了它,它甚至可以将斜线转换为圆点。

例如

<TextBox.Text>
 <Binding Path="Person.DateOfBirth" UpdateSourceTrigger="LostFocus" StringFormat='{}{0:dd.MM.yyyy}'></Binding>
</TextBox.Text>

如果您使用的是日期选择器,则需要使用上面的字符串格式覆盖其文本框模板,如下面的链接所示。

如果您正试图将此链接应用于日期选择器,则此链接可能会有所帮助。

我建议您使用DateTimePicker并将其Format属性更改为Short。另一个选项是将TextBox更改为MaskedTextBox,并将其Mask属性更改为ShortDate (00/00/0000)DateTimePicker允许您在验证日期时间值方面不做太多工作。但如果您使用MaskedTextBox,则应该对其进行验证。示例链接显示了如何进行验证。

我已经修改了上面的代码

        private void txt_in1_TextChanged(object sender, TextChangedEventArgs e)
    {
       int i = txt_in1.SelectionStart;
       if (bsp1 != 1)
       {
           if (i == 2)
           {
               txt_in1.Text += ":";
               txt_in1.SelectionStart = i + 1;
           }
       }
    }
    private void txt_in1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Back)
        {
            bsp1 = 1;
        }
        else
        {
            bsp1 = 0;
        }
    }

我已经采取了另一个事件,即keyup(等效的按键事件),因为每当检测到退格时,它都会标记bsp1变量,该变量将停止文本更改事件以放入":"。这里"bsp1"被定义为全局变量。(代码用于wpf,c#)。