Автоматическая коррекция текста в обычном TextBox - PullRequest
1 голос
/ 23 ноября 2011

Я хочу реализовать автокоррекцию в некоторых из TextBox в моем приложении.Я имею в виду, что когда пользователь вводит текст, через несколько секунд текст должен быть передан методу, исправлен и возвращен обратно в текстовое поле.

На данный момент у меня есть очень простая процедурадля исправления.Предполагается, что мои текстовые поля получают значение измерения от пользователя (например, 1.25 mA, 1.25uA, .666 A).

Представьте, что у меня есть метод коррекции под названием CorrectValue:

private void CorrectValue(TextBox tb)
{
   tb.Text = tb.Text.Trim().Remove('', string.Empty);
   //Actual correction is going to be much more complicated
}

Так что было бы лучшим подходом для этого?какие события следует предпринять?Как посчитать секунды, потраченные пользователем на запись в TextBox?

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011

Лучшим местом для проверки ввода является событие Validating элемента управления TextBox.Если введенное значение недопустимо, установите e.Cancel в этом случае на false.

2 голосов
/ 23 ноября 2011

Для меня лучшим событием для таких исправлений / проверки ввода является событие Validating.

Проблема с TextChanged заключается в том, что это происходит при наборе текста, и вы не можете быть уверены, что пользователь завершил ввод.

1 голос
/ 23 ноября 2011

это пользовательский элемент управления silverlight , который я сделал (это извлечение из реального производственного кода, работает безупречно), который делает именно то, что вам нужно: реагировать на ввод с определенной задержкой.он использует события для имитации «текстового сообщения».Адаптировать его к формам Windows просто.

public partial class DelayedTextBox : UserControl
{
    private DispatcherTimer eventTimer = new DispatcherTimer();
    public double TextChangedDelay
    {
        get { return eventTimer.Interval.TotalMilliseconds; }
        set { eventTimer.Interval = TimeSpan.FromMilliseconds(value); }
    }

    public delegate void DelayedTextChangedHandler(object sender, RoutedEventArgs e);
    public event DelayedTextChangedHandler DelayedTextChange;

    private object relayedSender = null;
    private RoutedEventArgs relayedE = null;

    public string Text
    {
        get
        {
            return PlainTextBox.Text;
        }

        set
        {
            PlainTextBox.Text = string.IsNullOrEmpty(value) ? string.Empty : value;
        }
    }

    //----------------------------------------------------------------------------------------------
    public TimedTextChangedTextBox()
    {
        InitializeComponent();

        TextChangedDelay = 500;
        eventTimer.Tick += new EventHandler(eventTimer_Tick);
    }

    private void StartTimer(object sender, RoutedEventArgs e)
    {
        relayedSender = sender;
        relayedE = e;
        eventTimer.Start();
    }

    private void StopTimer()
    {
        eventTimer.Stop();
        relayedSender = null;
        relayedSender = null;
    }

    private void eventTimer_Tick(object sender, EventArgs e)
    {
        StopTimer();
        if (DelayedTextChange != null)
            DelayedTextChange(relayedSender, relayedE);
    }

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (!maskedInput)
            ReactToInput(sender, e);
    }

    private void ReactToInput(object sender, RoutedEventArgs e)
    {
        if (!eventTimer.IsEnabled)
        {
            StartTimer(sender, e);
        }
        else
        {
            StopTimer();
            StartTimer(sender, e);
        }
    }
}

Вы можете использовать элемент управления точно так же, как вы обычно используете TextBox.подписаться на его DelayedTextChange событие, чтобы реагировать на ввод пользователя.

1 голос
/ 23 ноября 2011

Самая базовая реализация будет для вас использовать событие TextChanged Textbox.В этом случае вы можете использовать свой метод CorrectValue ().В качестве параметра для функции вы можете преобразовать параметр 'sender' события в TextBox и передать его своему методу.

Edit: Для подсчета времени вы можете установить таймери запустить его каждые 0,5 секунды, например.Например, через 2 секунды вы вызываете метод Correction.Например:

private int _ticks;

private void textBox1_TextChanged(object sender, EventArgs e)
{
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    if (_ticks++ == 4)
    {
        //Call correction method
        timer1.Stop();
        _ticks = 0;
    }
}
...