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# 中不知道...

4

3 回答 3

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");
}
于 2013-05-03T08:24:54.083 回答
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方法会将字符串分配给文本框(使用适当的调度程序进行线程同步)。

于 2013-05-03T08:05:19.297 回答
0

您可以使用延迟绑定:

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

请注意,您应该设置一些类,该类具有调用的属性并Text按照INotifyPropertyChangedor或本身 的方式实现。DataContextWindowUserControlTextBox

msdn 的示例:http: //msdn.microsoft.com/en-us/library/ms229614.aspx

于 2013-05-03T08:04:06.653 回答