将TextBox输入限制到特定值而不会干扰光标位置

时间:2017-08-17 05:54:12

标签: c# wpf mvvm textbox cursor

我有一个WPF应用程序(MVVM)。我想限制用户在TextBox中输入超过特定值的值。 假设该值为“100”,则用户不应该输入101等。我尝试过以下代码。

XAML:

<TextBox Text="{Binding SearchText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" Name="SearchTextBox"  TextChanged="TextBox_TextChanged"/>

CODE:

 private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (textBox != null && !string.IsNullOrEmpty(textBox.Text))
        {
            int searchIndex = 0;
            int count = 100;
            int.TryParse(textBox.Text, out searchIndex);

            if (textBox != null && !string.IsNullOrEmpty(textBox.Text))
            {
                if (searchIndex > Count)
                {
                    textBox.Text = textBox.Text.Substring(0, textBox.Text.Length - 1);
                }
            }
        }
    }

使用此代码,我可以限制用户输入超过特定值。但问题是,当我设置TextBox的文本时,光标移动到第一个数字。对此有什么解决方案吗?

4 个答案:

答案 0 :(得分:2)

您可以处理PreviewTextInput事件,并在验证失败时将Handled的{​​{1}}属性设置为TextCompositionEventArgs

true
  

感谢。你的回答解决了我的大部分问题。但是,如果我删除第一个数字并输入另一个数字,则验证失败。假设计数为150.我输入150&amp;然后删除1&amp;再次输入1然后文本框将获得501&amp;验证将失败

嗯,毕竟你应该坚持处理private void SearchTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { TextBox textBox = sender as TextBox; if (textBox != null) { string text = textBox.Text + e.Text; if (!string.IsNullOrEmpty(text)) { int searchIndex = 0; int count = 100; int.TryParse(text, out searchIndex); e.Handled = (searchIndex > count); } } } 事件。试试这个:

TextChanged

答案 1 :(得分:1)

试试这个:

<强>代码

 private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (textBox != null && !string.IsNullOrEmpty(textBox.Text))
        {
            int searchIndex = 0;
            int count = 100;
            int.TryParse(textBox.Text, out searchIndex);

            if (textBox != null && !string.IsNullOrEmpty(textBox.Text))
            {
                if (searchIndex > count)
                {
                    textBox.Text = textBox.Text.Substring(0, textBox.Text.Length - 1);
                    textBox.SelectionStart = textBox.Text.Length;
                    textBox.SelectionLength = 0;
                }
            }
        }
    }

答案 2 :(得分:1)

One&amp; two。在这两个答案的帮助下,我解决了我的问题。我正在处理两个事件PreviewKeyDown&amp;框TextChanged。

代码:

  private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
            TextBox textBox = sender as TextBox;
            int searchIndex = 0;
            int Count = 100;
            int.TryParse(textBox.Text, out searchIndex);
            if (textBox != null && !string.IsNullOrEmpty(textBox.Text))
            {
                if (searchIndex > Count)
                {
                    textBox.Text = OldValue.ToString();
                    textBox.SelectionStart = start;
                 }
             }
      }

public int OldValue = 0;
public int start = 0;


 private void SearchTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        int.TryParse(textBox.Text, out OldValue);
        start = textBox.SelectionStart;
    }

我在PreviewKeyDown事件上保存oldvalue并在TextChanged事件中使用它。

答案 3 :(得分:0)

您可以像这样使用SelectionStartSelectionLength

if (searchIndex > Count)
{
     textBox.Text = textBox.Text.Substring(0, textBox.Text.Length - 1);
     textBox.SelectionStart = textBox.Text.Length -1;
     textBox.SelectionLength = 0;
}