【问题标题】:Display Icon each second (Countdown timer)每秒显示图标(倒计时)
【发布时间】:2016-01-29 12:13:57
【问题描述】:

我正在尝试在我的表单上显示一种倒数计时器。一旦满足某些条件,我的程序基本上会捕获用户的快照(通过网络摄像头)。一旦满足条件,我想显示一个倒数计时器,理想情况下是基于图片的(通过启用我在表单上的图标),然后捕获网络摄像头图像。

到目前为止,我一直在尝试使用计时器,因此在每次滴答时它都会显示一个图标,稍后会显示下一个图标。等等然后捕获图像。到目前为止,我只能让它显示一个图标并拍照,我不确定如何让图标在每个刻度上更改 x 秒

例如

public void matchconditionshere()
   // match conditions here
   timer1.Start()

public void timer1_Tick(object sender, EventArgs e)
 {
   _3.Visibility = Visibility.Visible
   _2.Visibility = Visibility.Collapsed
   _1.Visibility = Visibility.Collapsed

    // not sure what to put here to generate another tick?

   _2.Visibility = Visibility.Visible
   _3.Visibility = Visibility.Collapsed
   _1.Visibility = Visibility.Collapsed

   _1.Visibility = Visibility.Visible
   _3.Visibility = Visibility.Collapsed
   _2.Visibility = Visibility.Collapsed

   _capture.Start() 
   // capture image from webcam

任何帮助将不胜感激。

【问题讨论】:

    标签: c# timer


    【解决方案1】:

    既然您说要使用图标,看来您需要在此处添加逻辑,以便您可以正确选择要显示的图标。例如,对于 3 秒倒计时,您必须添加代码以知道第一个刻度还剩 3 秒(以便显示 3 秒图标),第二个刻度还有 2还剩几秒,以此类推。

    换句话说,类似于:

    // only example value; get a real one from another input/event handler
    private int _countDownSeconds = 3;
    public void webCamTimer_Tick(object sender, EventArgs e)
    {
        switch (_countDownSeconds--) {
            case 3:
                // show icon for 3 and return
                break;
            case 2:
                // show icon for 2 and return
                break;
            case 1:
                // show icon for 1 and return
                break;
            case 0:
                // time to take picture
                _webCam.TakeSnapshot();
                break;
            default:
                // log a message, ask user to re-enter time limit,
                // or simply re-assign a previously entered value;
                // for example:
                _countDownSeconds = Convert.ToInt32(userTimeLimitTextBox.Text);
                break;
        }
    }
    

    可能值得考虑的是,测试/维护这可能更耗时,尤其是当倒计时计时器需要更新时(例如,将其更新为 5 秒而不是 3 秒,或者让它由用户配置, 等等。)。此外,倒数计时器越高,您需要考虑的排列数量就越多。您已经可以看到一个简单的 3 秒计时器的案例数。

    也许将倒计时显示为数字的string 表示(例如ToString() 方法)从长远来看会更好。

    PS:您还应该使用 .NET 命名约定。您可以查看 MSDN 文档以获取有关这些内容的更多信息,但一般来说,只需查看您正在使用的 .NET 类/方法/属性中已有的命名模式。

    【讨论】:

    • 嗨,雷,我试过你的解决方案,效果很好。非常感谢您的帮助! :)
    【解决方案2】:

    您可以定义计数器和计数计时器滴答声。使用switch 中的刻度计数器来定义在什么时候做什么:

    int _counter;
    
    void timer1_Tick(object sender, EventArgs e)
    {
        _counter++;
        switch(_counter)
        {
            case 1:
                _1.Visibility = Visibility.Visible;
                ...
                break;
            case 10: // do something at 10th tick
                _2.Visibility = Visibility.Visible;
                ...
                break;
            ...
        }
    
        // capture image from webcam
        _capture.Start() 
    }
    

    【讨论】:

    • 另外,我认为 _counter=0; 应该在调用条件满足函数时添加。否则它将不断增加,并且永远不会评估到其中一个 switch 案例。它只会第一次这样做。
    【解决方案3】:

    从您发布的问题和示例中,我了解到,对于每个刻度,您都希望显示 3 列表中的一张图片。这可以通过以下方式实现:

    static int count=1;
    public void timer1_Tick(object sender, EventArgs e)
    {
       if(count==1)
       {
          _1.Visibility = Visibility.Visible;
          _2.Visibility = Visibility.Collapsed;
          _3.Visibility = Visibility.Collapsed;
          count++;
       }
       else if(count==2)
       {
          _2.Visibility = Visibility.Visible;
          _1.Visibility = Visibility.Collapsed;
          _3.Visibility = Visibility.Collapsed;
          count++;
       }
       else
       {
          _3.Visibility = Visibility.Visible;
          _1.Visibility = Visibility.Collapsed;
          _3.Visibility = Visibility.Collapsed;
          count==1;
          _capture.Start() 
       }
    }
    

    _capture.Start() 方法中,确保您停止计时器。否则计时器将继续运行多次调用该方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      相关资源
      最近更新 更多