计时器似乎没有打勾(直到我最小化窗口)

时间:2014-08-28 19:17:36

标签: c# .net winforms timer

这是设计窗口的图像:

enter image description here

以下是MainForm.Designer.cs文件:

namespace SamsCSharp24
{
    partial class ImeObrasca
    {
        // irrelavent code is omitted, only event subscriptions are left
        private void InitializeComponent()
        {
            // irrelavent code is omitted for brewity
            // 
            // SelectPicture
            // 
            this.SelectPicture.Paint += new System.Windows.Forms.PaintEventHandler(this.SelectPicture_Paint);
            this.SelectPicture.Click += new System.EventHandler(this.SelectPicture_Click);
            // 
            // Quit
            // 
            this.Quit.Click += new System.EventHandler(this.Quit_Click);
            // 
            // PictureBox
            //
            this.PictureBox.MouseLeave += new System.EventHandler(this.PictureBox_MouseLeave);
            this.PictureBox.MouseEnter += new System.EventHandler(this.PictureBox_MouseEnter);
            // 
            // btnOptions
            //
            this.btnOptions.Click += new System.EventHandler(this.btnOptions_Click);
            // 
            // timerClock
            // 
            this.timerClock.Tick += new System.EventHandler(this.timerClock_Tick);
        }

        #endregion
    }
}

以下是MainForm.cs文件:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SamsCSharp24
{
    public partial class ImeObrasca : Form
    {
        public ImeObrasca()
        {
            InitializeComponent();
            // when uncommenting below line, window is not seen in taskbar
            // this.ShowInTaskbar = false; 
        }

        // other code is omitted for brewity 
        private void SelectPicture_Paint(object sender, PaintEventArgs e)
        {
            // just for fun, change color of a button to light blue
            SelectPicture.BackColor = Color.Azure;
        }

        private void timerClock_Tick(object sender, EventArgs e)
        {
            // when timer ticks, change label's text into current time of day
            staticClock.Text = "Current time of day: " +
                DateTime.Now.Hour.ToString() + " : "  +
                DateTime.Now.Minute.ToString() + " : " +
                DateTime.Now.Second.ToString();
        }
    }
}

定时器控件具有以下通过设计器设置的属性:

Enabled = true;
Interval = 1000
Name = timerClick
Tick (event) = timerClock_Tick

至于标签,这里是设置设置的属性:

BorderStyle = FixedSingle
Name = staticClock
Autosize = false
Text = 
Other properties are default or irrelevant ( like Location or Size )

问题:

当我运行应用程序时(在调试模式下),会出现一个窗口,其中包含正确放置的控件并且看起来正确。代码的每个其他部分都能成功运行(图片打开/绘图等),但标签仍为空,如设计师最初设置的那样。

在最小化/最大化窗口后,标签文本设置正确。我试图移动窗口的一部分,标签“在屏幕外”,并让它回来看看会发生什么。标签中的文字已更改有时 - >它没有更新正确。

我努力解决问题:

这是我第一次尝试使用C#和WinForms,所以我试图在计时器上找到一些在线文档。

在检查.Designer.cs文件后,我发现工具箱中的计时器属于System.Windows.Forms.Timer类。我找不到任何帮助我,因为在备注部分声明将属性Enabled设置为true启动计时器,并将其设置为false将其停止。

我试图放置简单的消息框,当窗口最小化时它开始正常弹出。当窗口处于正常状态时,没有任何显示,但程序的其他部分运行良好(图片打开/绘图/等)。

在尝试使用Google进行解决方案/搜索之后,我找不到具体的解决方案(虽然提出了一些建议,但正如我所说,它们对我没有帮助。)

问题:

如何修改计时器的刻度线处理程序,以便每隔一段时间修改标签的文本?

我做错了什么?

1 个答案:

答案 0 :(得分:2)

正如Hans Passant在其中一条评论中所说,“Paint事件处理程序应该只绘制,它们永远不应该更改导致Paint事件再次被触发的属性。这样的恶作剧会导致UI线程烧掉100%核心,永远不会调度低优先级的合成消息。就像WM_TIMER一样。最小化窗口会暂时停止。“