如何检测控件的可见性?

时间:2011-07-14 13:53:49

标签: c# .net winforms controls visibility

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

5 个答案:

答案 0 :(得分:1)

这似乎是经常被问到的主题之一,并且根据具体情况有许多可能的解决方案。

首先,为了参考起见,一些链接到我在研究期间偶然发现的旧讨论:

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

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

(部分)解决方案: 可视跟踪器,它基本上管理控件本身和每个祖先控件的专用适配器。适配器处理依赖于祖先类型的可见性,即。对于一个控件,它只是实例。可见,对于一个TabPage,我检查选择了哪个页面,... 然后,经理的家务管理只是为了跟踪所有祖先的父母变化,以便跟踪正确的可见性。

答案 1 :(得分:0)

抓住表单是否具有焦点或最小化是最好的选择,但我不确定是否会触及所有情况。一般情况下,我会更新,无论用户是否正在关注,除非需要大量的周期才能将信息提供给表单,我对此表示怀疑。在应用程序中设置条件位只会增加另一个出错的地方。

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

在Windows中,“用户正在看我”属性并不神奇。

答案 2 :(得分:0)

这是绝对必要的。当窗口不可见时,Windows不会生成Paint事件。如果你自己实现绘画,那么一定要在Paint事件中执行此操作,如果有理由重新绘制,则调用Invalidate()。

答案 3 :(得分:0)

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

审核其他评论后编辑:

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

答案 4 :(得分:-1)

相关问题