【发布时间】:2017-03-26 12:37:18
【问题描述】:
我有一个带有自定义“选项卡”概念的 WinForms 应用程序,其中有 3 个按钮调用各自的面板“BringToFront()”方法。
由于这些面板都是在初始化表单时初始化的,但包含它们自己的单独功能,所以我不想在面板被“切换”到之前初始化一些更密集的任务。
例如,我的一个面板具有 Twitter 连接功能。如果我在面板初始化时初始化 Twitter 连接,它可能会失败,而理论上用户在完全不同的面板/功能上。
我只希望它在用户来到此面板后尝试连接到 Twitter。
所以,我一直在阅读 MSDN,但找不到在控件显示顺序更改时触发的事件。
我遇到过这些事件,但不确定哪些/如果有的话,这些是最有效的还是最好的:
Panel.OnVisibleChanged
Panel.OnEnter
Panel.OnGotFocus
我仍在学习 C#,因此感谢任何帮助/cmets。
【问题讨论】:
-
为每个面板保留一个标志,以显示面板是否已加载。创建一个切换到面板的方法。在方法中,检查面板是否仍然没有加载,然后加载并设置标志并将其置于最前面。
-
这个问题是后台任务的一个很好的例子。一旦您感觉当前面板的属性已设置,您就可以开始在后台初始化其他面板。 Panel 的 tag 属性可用于保存一个布尔值(无论是否设置)。此外,您可以隐藏和显示面板而不是 BringToFront。这将触发 VisibleChanged 事件,并且一旦它们可见就很容易捕获和处理。
-
作为另一个选项,您可以将面板的内容封装在
UserControl类中,然后在第一次单击按钮时,检查相关面板是否为空,然后创建所需用户控件的实例并将其添加到面板中。您可以将加载逻辑封装在用户控件的Loading事件中。 -
您将不得不停止为此寻找活动,没有任何活动。用户永远不能自己做任何事情来改变控件的 Z 顺序,只有您的代码可以做到这一点。因此解决方案非常简单,只需声明您自己的事件并在调用 BringToFront() 的相同方法中引发它。使用 TabControl 而不是自己动手是另一个简单的解决方案。