【问题标题】:Winforms label updates on 1min timer tick. Minimize for >1min, label doesn't repaint on restoreWinforms 标签在 1 分钟计时器滴答时更新。最小化 > 1 分钟,标签不会在恢复时重新绘制
【发布时间】:2014-09-26 21:12:29
【问题描述】:

主题说明了一切。我实际上将标签用作伪进度条,因此它具有纯蓝色背景色,没有文本,并且我在每个计时器滴答声上增加其宽度。除了一个奇怪的情况外,这很好用:

如果我整天开着窗户,没关系。

如果我最小化不到一分钟并恢复,就可以了。

只有当我最小化超过一分钟(足够长以至于实际触发滴答声),然后恢复窗口时,标签才不会重新绘制。也就是说,当我恢复窗口时,会显示在刻度期间未动态更新的其他标签,但不会重新绘制动态更新的特殊标签(我希望为蓝色的像素是窗口的背景颜色,a非常浅的灰色)。是的,如果恢复的窗口在那里直到下一个刻度,标签会以预期的方式重新绘制为蓝色。窗口未锁定 - 它响应输入。我使用的是拖到表单上的 Windows.Forms.Timer,而不是代码中的 System.Timers.Timer。

那么,是用户错误还是 OS/.NET 框架错误?

编辑 1: 根据下面的答案 1,尝试读取另一个标签的宽度会触发问题。为什么窗口的最小化状态会影响读取标签的宽度?

【问题讨论】:

  • 你能发布一些重现问题的代码吗?
  • 作为一种快速解决方法,您可以在最小化时禁用计时器并在最大化时恢复。这有点垃圾,最好尝试解决原因,但我们需要您提供更多信息...
  • 你说它工作正常,除非一分钟过去了。问题是,你的代码不能正常工作,你很幸运它在其他场合也能正常工作。您很幸运地发现了一个错误!
  • 我无法重现该问题,因此您必须向我们展示导致该问题的代码。告诉我们您也在使用哪种操作系统可能会有所帮助。
  • 当我克隆项目并从中剥离所有看似非必要的东西时,剥离的版本并没有出现问题。我将不得不对完整版进行一些选择性评论,看看我是否可以隔离它。

标签: vb.net winforms timer label repaint


【解决方案1】:

我已将其隔离为这一行代码,它位于我的滴答事件调用的 sub 中:

        fakebar.Width = Int((spanSoFar / spanOverall) * (fakeborder.Width - 2))

莫名其妙地,省略读取 fakeborder 对象(一个不会动态更新的标签)解决了这个问题:

        fakebar.Width = Int((spanSoFar / spanOverall) * (366))

这似乎不是用户错误,但可能发生了一些我不知道的事情。

【讨论】:

  • 此代码属于您的问题。你会得到一个答案来解释最小化窗口上的 Control.Width 属性会发生什么。
  • 读取标签的宽度似乎很普通,以至于没有考虑(当时)。最小化窗口上的 control.width 会发生什么?
  • 我的意思是,当窗口最小化(为 0)时,我可以使用断点和即时窗口来打印控件的宽度,但是为什么哦为什么系统会这样呢?
  • 在文档中没有提到 .width 的警告:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多