C#WinForms控制订单更改事件

时间:2017-03-26 12:37:19

标签: c# .net winforms

我有一个带有自定义“tab”概念的WinForms应用程序,因为有3个按钮可以调用各自的面板“BringToFront()”方法。

由于这些面板在表单初始化时都已初始化,但包含自己的单独功能,因此我不想初始化一些更密集的任务,直到该面板已“切换”为止。

例如,我的一个Panel具有Twitter连接功能。如果我在Panel初始化时初始化Twitter连接,它可能会失败,而理论上用户处于完全不同的面板/功能。

我只希望在用户进入此面板后尝试连接到Twitter。

所以,我一直在阅读MSDN,但找不到控件显示顺序发生时触发的事件。

我遇到过这些事件,但不确定哪些/如果有的话,这些工作或最好:

Panel.OnVisibleChanged Panel.OnEnter Panel.OnGotFocus

我还在学习C#,所以感谢任何帮助/评论。

3 个答案:

答案 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();
}