延迟加载表单

时间:2009-07-14 12:46:56

标签: c# .net winforms compact-framework

我有一个.NET CF程序(在智能手机上运行),我已经为它编写了一个选项页面。

在选项页面上,我有6个其他表格的链接,其中包含实际选项。 当主窗体加载时,它会创建6个子窗体并将它们存储在准备启动的列表中。这个问题是制作这些表单所需的初始创建时间,这使得主要设置变得缓慢。

我理想的是,只需指定在加载时创建子表单所需的类型和参数,然后在需要时实际创建表单。

以下是目前工作原理的代码摘要:

Form_OnLoad():

AddSettingsOptions("General", new General());
AddSettingsOptions("Action Alert", new BaseAlertForm("Action Alert Settings", SystemManager.ActionAlert));
AddSettingsOptions("Comms Alert", new BaseAlertForm("Comms Alert Settings", SystemManager.CommsErrorAlert));
AddSettingsOptions("Advanced", new Advanced());
AddSettingsOptions("Diagnostics", new Diagnostics(_unitWatcher));
AddSettingsOptions("About", new About());

表单存储在列表的Tag部分(显示子选项)

private void AddSettingsOptions(String name, Form form)
{
    listViewSettings.Items.Add(
        new ListViewItem(
            String.Format(" {0}   {1}", listViewSettings.Items.Count + 1, name))
            {
                Tag = form
            }
        );
}

如果按下某个选项,则会调用以下函数来启动表单

private void ShowSubSetting(ListViewItem item)
{
    if (item == null)
        return;

    object tag = item.Tag;
    Form form = tag as Form;
    if (form != null)
    {
        form.ShowDialog();
        //form.Dispose();
    }
}

我确信有一个非常简单的方法可以做到这一点,我只是在努力正确的方式。 感谢

1 个答案:

答案 0 :(得分:2)

你可以这样做:

AddSettingsOptions("General", ()=> new General() );
AddSettingsOptions("Action Alert", ()=> new BaseAlertForm("Action Alert Settings", SystemManager.ActionAlert) );
// etc ...

void ShowSubSettings(ListViewItem item ){
   if ( null == item ) { continue; }

   object tag = item.Tag;
   Func<Form> func = tag as Func<Form>;
   if ( null != func ) {
      Form frm = func();
      if ( null != frm ) {
          frm.ShowDialog();
      }
   }
}

如果您使用的是C#2.0,则必须使用

delegate { return new General(); }

而不是

()=> new General();