Ленивые формы нагрузки - PullRequest
0 голосов
/ 14 июля 2009

У меня есть программа .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());

Форма хранится в разделе тегов списка (в котором отображаются подопции)

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 Ответ

2 голосов
/ 14 июля 2009

Вы можете сделать это так:

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();
...