我有一个带有自定义“tab”概念的WinForms应用程序,因为有3个按钮可以调用各自的面板“BringToFront()”方法。
由于这些面板在表单初始化时都已初始化,但包含自己的单独功能,因此我不想初始化一些更密集的任务,直到该面板已“切换”为止。
例如,我的一个Panel具有Twitter连接功能。如果我在Panel初始化时初始化Twitter连接,它可能会失败,而理论上用户处于完全不同的面板/功能。
我只希望在用户进入此面板后尝试连接到Twitter。
所以,我一直在阅读MSDN,但找不到控件显示顺序发生时触发的事件。
我遇到过这些事件,但不确定哪些/如果有的话,这些工作或最好:
Panel.OnVisibleChanged
Panel.OnEnter
Panel.OnGotFocus
我还在学习C#,所以感谢任何帮助/评论。
答案 0 :(得分:3)
我遇到了同样的问题,我通过让每个标签实现一个界面并在我尝试加载它时将其解决(我希望这是有意义的)来修复它(https://github.com/WithoutCaps/LimitlessUI/blob/master/LimitlessUI/TabsAdapter_WOC.cs)
第30/31行
if(tab is Tab_WOC)
((Tab_WOC)tab).onShowTab();
随意使用此代码/库
注意:还有演示应用程序!
答案 1 :(得分:0)
这个问题是背景任务的一个很好的例子。一旦您感觉当前面板的属性已设置,您就可以开始在后台初始化其他面板。如果设置与否,Panel的标签属性可用于保留布尔值。此外,您可以隐藏和显示面板而不是BringToFront。这将触发VisibleChanged事件,并且一旦可见就很容易捕获和处理。 这是为了向您展示后台工作者代码将如何。
private void BackgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
if (!Convert.ToBoolean(Panel1.Tag)) {
//Intialize panel1
Panel1.Tag = true;
}
if (!Convert.ToBoolean(Panel2.Tag)) {
//Intialize panel2
Panel2.Tag = true;
}
if (!Convert.ToBoolean(Panel3.Tag)) {
//Intialize panel3
Panel3.Tag = true;
}
}
答案 2 :(得分:0)
显然我不知道你的项目是如何布局的,但我看到了两个选择。
选项1:延迟加载的属性
创建一个属性,当你调用它时检查一个字段是否为null,如果是,则通过调用你想要的任何昂贵的类构造函数来初始化它。
public TwitterCommunicator TwitterCommunicator => _twitterCommunicator ?? (_twitterCommunicator = new TwitterCommunicator());
public void AnotherTwitterPanelMethod()
{
TwitterCommunicator.LoadTweets();
}
选项2:使用Lazy<T>
与延迟加载属性类似。实际上使用Lazy,它实际上在你想要初始化时提供对象的延迟初始化。
public partial class MainForm : Form
{
public MainForm()
{
Lazy<TwitterCommunicator> _lazyTwitter = new Lazy<TwitterCommunicator>();
}
}
public void SomeTwitterPanelMethod()
{
_lazyTwitter.Value.LoadTweets();
}