在WPF中延迟后重置变量的值

时间:2011-04-01 19:44:23

标签: c# .net wpf

我有一些代码执行并获取执行的返回值。 我将此值设置为我的窗口的依赖项属性,因为有绑定到它的样式触发器。 当变量为0时,它使用默认样式,1表示偏红样式,2表示绿色。

但是我必须在一段时间后以某种实际的方式重置这种风格。

最简单的方法是什么?

if (!Compiler.TryCompile(strText, Models[Model], EntryPoint.Text, out error))
{
    output.Items.Add("Error compiling:");
    output.Items.Add(error);
    CompilationStatus = 1; // dependency property bound on ui
}
else {
    output.Items.Add("Compilation successful!");
    CompilationStatus = 2; // dependency property bound on ui
}

// should execute this after 5 seconds 
CompilationStatus = 0;  // dependency property bound on ui

WPF和.Net 4用于项目。 谢谢!

2 个答案:

答案 0 :(得分:1)

我通常会使用自定义扩展方法:

public static class DispatcherHelper
{
    public static void DelayInvoke(this Dispatcher dispatcher, TimeSpan ts, Action action)
    {
        DispatcherTimer delayTimer = new DispatcherTimer(DispatcherPriority.Send, dispatcher);
        delayTimer.Interval = ts;
        delayTimer.Tick += (s, e) =>
        {
            delayTimer.Stop();
            action();
        };
        delayTimer.Start();
    }
}

在您的情况下,您可以像这样使用它:

Dispatcher.DelayInvoke(TimeSpan.FromSeconds(5), () => 
{
   CompilationStatus = 0; 
}

编辑:我忘记了,但看起来这个方法最初是由Jon Skeet在这个SO线程中编写的:Delayed Dispatch Invoke?

答案 1 :(得分:0)

如果时间准确性不是问题,并且由于您使用的是WPF和.Net 4,这是一个非常简单的问题,只需用以下内容替换您的代码:

new Task(delegate() {
  Thread.Sleep(5000);
  Dispatcher.Invoke((Action)delegate(){
     CompilationStatus = 0;
  });
}).Start();

它将通过调度程序在UI线程上调用,因此您应该是安全的。

这个Fire @ Forget方法不是很精确,如果CPU处于压力之下可能会滞后。如果这对你来说不合适,那么你应该使用System.Diagnostics中的Stopwatch类。