如何检测控件的可见性

本文关键字:控件 可见性 检测 何检测 | 更新日期: 2023-09-27 18:01:59

如何检测控件是否对用户可见?我有一个显示应用程序状态的控件,我希望只有在用户看到它时才更新它(例如,要更新它的值,增加进度条的值,或更改标签的Text属性)。如果用户最小化了包含此控件的窗体,或者另一个窗体与此控件重叠,则无需更新此控件。我只是不想做额外的计算,如果控件是不可见的任何方式。此外,如何检测隐藏/显示此控件的事件?

如何检测控件的可见性

这似乎是一个经常被问到的话题,并且根据上下文有许多可能的解决方案。

首先,作为参考,一些链接到我在研究中偶然发现的旧讨论:

  • 如何检查绝对控制可见性以及如何通知绝对可见性的变化
  • c# winform检查控件是否可见

起始位置:用于异构系统的IDE,这些系统有许多不同的硬件和许多不同的传输层,其中一些传输层非常慢。其中一个特性是在编辑器中显示远程内存值。一个典型的用例是打开>20个编辑器,每个编辑器显示1到100个不同的值。

由于传输层的带宽有限,我正在寻找一种解决方案来"优先"数据采集。

(部分)解决方案:一个可见性跟踪器,它基本上管理控件本身和每个祖先控件的专用适配器。适配器根据祖先类型处理可见性。对于Control,它只是instance。可见,对于TabPage,我检查哪个页面被选中,…然后,管理器的内务管理只是跟踪所有祖先的父级更改,以便它跟踪正确的可见性。

捕捉表单是否有焦点或最小化是您最好的选择,但我不确定这是否适用于所有情况。一般来说,不管用户是否注意,我都会更新,除非需要大量的循环才能将信息发送到表单,我对此表示怀疑。在应用程序中设置条件位只会增加出错的地方。

让我们稍微检查一下。最小化形式是一回事。如果表单被最小化,你知道用户根本就没在看它。但是,如果另一个表单在前面,那么你需要检查表单是否有焦点。这里的问题是,一个人可以用一半的屏幕看电视,而在另一半屏幕上打字。Word有焦点,所以表单不会更新,这不是你的意图。如果在应用程序中创建另一个表单,也可能发生同样的情况。更新不再有焦点。

在Windows中没有神奇的"用户在看我吗"属性。

这是不必要的。当窗口不可见时,窗口不会生成"绘制"事件。如果您自己实现了绘制,那么请确保仅在Paint事件中执行此操作,并在有理由重新绘制时调用Invalidate()。

状态多久改变一次?最好是在状态改变时更新状态指示器,而不用担心可见性。假设状态平均每5分钟改变一次。当状态改变时,窗口/控件可能不可见,但在下一次状态更新之前很容易变得可见。在这种情况下,状态指示灯在下一次更新之前将是错误的,因为您避免更改指示灯。除非更新状态指示器非常昂贵,否则最好不要尝试预测用户将做什么。

审稿后编辑:

我认为你可以通过确定一个检测/通知状态变化的模型而不是按需计算来实现更好的效率改进。您可能需要权衡状态更改的频率和控件可见性更改的频率。

查看控件。可见和控件。VisibleChanged事件。