2013-05-03 7 views
2

У меня есть программа, которая переводит текст на другой язык. Я хочу улучшить его с помощью этой небольшой функции: текст переводится в реальном времени, когда пользователь вводит его.Обработка текста в реальном времени

Я написал этот код:

private void TextBox_KeyUp_1(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    TranslateBox.Text = translate.translateText(TextToTranslate.Text, "eng", "es"); 
} 

Это работает, но в то время как я типа "Hello World", эта функция будет вызвана 11 раз. Это большой груз. Есть ли способ установить тайм-аут для этой функции?

PS. Я знаю, как это делает в JS, но не в C# ...

+0

WPF или winforms? – 2kay

+0

Я использовал WPF для этого приложения. –

ответ

0

Вы можете использовать связывание с задержкой:

<TextBox Text="{Binding Path=Text, Delay=500, Mode=TwoWay}"/> 

Обратите внимание, что вы должны установить некоторый класс, который имеет свойство Text и инвентарь INotifyPropertyChanged, как DataContext из Window или UserControl или TextBox .

Пример на MSDN: http://msdn.microsoft.com/en-us/library/ms229614.aspx

0

Я использовал следующий код для аналогичных целей:

private readonly ConcurrentDictionary<string, Timer> _delayedActionTimers = new ConcurrentDictionary<string, Timer>(); 
private static readonly TimeSpan _noPeriodicSignaling = TimeSpan.FromMilliseconds(-1); 

public void DelayedAction(Action delayedAction, string key, TimeSpan actionDelayTime) 
{ 
    Func<Action, Timer> timerFactory = action => 
     { 
      var timer = new Timer(state => 
       { 
        var t = state as Timer; 
        if (t != null) t.Dispose(); 
        action(); 
       }); 
      timer.Change(actionDelayTime, _noPeriodicSignaling); 
      return timer; 
     }; 

    _delayedActionTimers.AddOrUpdate(key, s => timerFactory(delayedAction), 
     (s, timer) => 
      { 
       timer.Dispose(); 
       return timerFactory(delayedAction); 
      }); 
} 

В вашем случае, вы могли бы использовать его как это:

DelayedAction(() => 
    SetText(translate.translateText(TextToTranslate.Text, "eng", "es")), 
    "Translate", 
    TimeSpan.FromMilliseconds(250)); 

.. где метод SetText присваивает строку текстовому полю (используя соответствующий диспетчер для синхронизации потоков).

3

Вы можете также рассмотреть сделать фактический перевод, когда вы нашли «слово» закончен, например, после/ушка/ввод набирается, или когда текстовое поле проигрышей фокуса и т.д.

private void TextBox_KeyUp_1(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if(...) // Here fill in your condition 
     TranslateBox.Text = translate.translateText(TextToTranslate.Text, "eng", "es"); 
} 
Смежные вопросы