【问题标题】:Updating UI control after specific time elapsed在特定时间过去后更新 UI 控件
【发布时间】:2020-06-15 08:58:00
【问题描述】:

包含自定义控件LabelProgressBar : ProgressBar 的 WinForms 应用程序。

有一种方法可以使这个控件不可见(调用时有效):

void statusIdle()
{
    labelProgressBar1.Visible = false;
}

我需要使这个控件不可见(通过调用上述方法)在它改变后的一段时间内(调用其他方法statusCompletedstatusFailed)。例如:

void statusCompleted(string action)
{
    // this is working
    labelProgressBar1.Visible = true;
    labelProgressBar1.Value = 100;
    labelProgressBar1.setColourAndText(LabelProgressBarColours.WARNING_COLOUR, action + " Completed With Warnings");

    // this is not
    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.AutoReset = false;
    timer.Elapsed += new ElapsedEventHandler(timerElapsed);
    timer.Start();
}

定时器的事件处理程序:

private void timerElapsed(object source, ElapsedEventArgs e)
{
    statusIdle();
}

控件未按要求更新。这是什么原因?

【问题讨论】:

  • 确保在调用 .Start() 时也启用了 TimerStatusIdle() 被调用?你确定你没有得到一个跨线程异常吗?当从Timer 调用StatusIdle() 时,我确信需要调用。
  • @Tomek 添加timer.Enabled=true 后,我刚刚尝试过。同样的问题。不会抛出异常。
  • 如果它是线程计时器,则需要通过调用将其编组到 UI 线程
  • ... 或将表单设置为Timer.SynchronizingObject 或使用System.Windows.Form.Timer,因此不需要编组(另外,它也可以工作:)。

标签: c# .net winforms timer controls


【解决方案1】:

对于一次性操作,您可以使用异步处理程序方法并添加延迟:

async void statusCompleted(string action)
{
    labelProgressBar1.Visible = true;
    labelProgressBar1.Value = 100;
    labelProgressBar1.setColourAndText(LabelProgressBarColours.WARNING_COLOUR, action + " Completed With Warnings");

    await Task.Delay(1000);
    statusIdle();
}

【讨论】:

    【解决方案2】:

    您的计时器是函数的局部变量。当函数结束时,它也结束了。因此,您可能需要将声明移至其他地方。

    【讨论】:

    • 不,这没有帮助。
    • 对于一个winform项目,你可以在表单中添加一个定时器。并将您的代码放入 timer_Tick 事件中。
    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2011-12-22
    • 2019-12-09
    相关资源
    最近更新 更多