繁体   English   中英

如何检测控件的可见性?

[英]How can I detect the visibility of a control?

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

这似乎是经常被问到的主题之一,并且有许多可能的解决方案,具体取决于上下文。

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

开始 position:一个 IDE 用于具有大量不同硬件和许多不同传输层的异构系统,其中一些非常慢。 一项功能是在编辑器中显示远程硬件的 memory 值。 一个典型的用例是打开超过 20 个编辑器,每个编辑器显示 1 到 100 个不同的值。

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

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

捕捉表单是否具有焦点或最小化是您最好的选择,但我不确定是否适用于所有情况。 一般来说,无论用户是否注意,我都会更新,除非需要大量的周期才能将信息发送到表单,我对此表示怀疑。 在应用程序中设置条件位只会为 go 错误添加另一个位置。

让我们来看看这个。 最小化 forms 是一回事。 如果表单被最小化,你就知道用户甚至没有看它。 但是,如果另一个表单在前面,那么你要检查表单是否有焦点。 这里的问题是一个人可以在另一半输入单词时使用一半屏幕观看。 Word 具有焦点,因此表单不会更新,这不是您的意图。 如果您在应用程序中创建另一个表单,也会发生同样的情况。 更新不再有焦点。

Windows 中的“用户是否在看我”属性没有魔法。

这从来没有必要。 当 window 不可见时,Windows 不会生成 Paint 事件。 如果您自己实现了绘画,请确保仅在 Paint 事件中执行此操作,并且如果有重新绘画的原因,则调用 Invalidate()。

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

查看其他评论后编辑:

我认为您可以通过识别 model 来检测/通知状态变化而不是按需计算来实现更好的效率改进。 您可能需要权衡状态更改的频率与控件可见性更改的频率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM