SCSF: MDI - Nastavení základních vlastností View

MyEgo.cz

home foto blogy mywindows.cz kontakt

SCSF: MDI - Nastavení základních vlastností View

Tak jsem řešil, jak nastavit základní parametry MDI view, respektive vlastností, které jsou dostupné na objektu WindowSmartPartInfo. V mém případě jsem potřeboval nastavit atributy Icon, Title, Width, Height. Ideálním řešením je samozřejmě jen jedno místo, které by bylo dosažitelné v rámci modulu.

Zkoušel jsem například toto:

První ideou bylo získání objektu ISmartPartInfo dle ID z kolekce WorkItem.SmartParts, nastavit vybrané vlastnosti a tím by bylo vystaráno. Avšak tohle řešení nefungovalo ve všech případech. Zkoušel jsem dát metodu, která provede nastavení, jak do presenteru, metoda OnViewReady a i do View, metoda OnLoad, ale v obou případech při otevření nebyl nalezen ISmartPartInfo objekt, který se vázal k danému View.

Zdrojáky vypadali asi takto:

Kód z View:

protected override void OnLoad(EventArgs e){
      _presenter.OnViewReady();
      base.OnLoad(e);
      if (ParentForm != null) {
         ParentForm.FormClosed += new FormClosedEventHandler(OnParentFormClosed);
      }
      _presenter.SetTitle(string.Empty);
      _presenter.SetSize();
}

Kód z Presenteru:

internal void SetTitle(string title){
      if (string.IsNullOrEmpty(title))
         title = "new record";
      string viewId = string.Format(UIExtensionSiteNames.ContactDetail,
ContextItem.Id.ToString());
      ISmartPartInfo partInfo = WorkItem.SmartParts[viewId] as ISmartPartInfo;
      if (partInfo != null)
         partInfo.Title = string.Format("{0} - {1}","Contact detail",title);
}
internal void SetSize(){
      string viewId = string.Format(UIExtensionSiteNames.ContactDetail,
ContextItem.Id.ToString());
      ContactDetailView view = WorkItem.SmartParts[viewId] as ContactDetailView;
      if (view != null)
      {
         Size minimizeSize = new Size(940,532);
         view.Size = minimizeSize;
         view.MinimumSize = minimizeSize;
      }
}

Řešení fungovalo, když už View bylo otevřené a bylo potřeba změnit Title nebo Size. Ale pokud se View otevíralo z ModuleControlleru a bylo potřeba nastavit tyto vlastnosti, tak to nešlo.

Druhým řešením je použití ISmartPartInfoProvider. V tomto případě View musí zdědit tento Interface a implementovat metodu GetSmartPartInfo. Tato metoda vrací objekt ISmartPartInfo v kterém jsou nastavené žádané vlastnosti. V mém případě jsem ještě přesunul vytvoření ISmartPartInfo objektu přesunul do presenteru.

Tady je kód z View třídy:

#region ISmartPartInfoProvider Members
public ISmartPartInfo GetSmartPartInfo(Type smartPartInfoType){
     return _presenter.SetPart(string.Empty,Width+10,Height+10);
}
#endregion

Tady je kód z presenteru:

internal ISmartPartInfo SetPart(string title,int width, int height){
        if (string.IsNullOrEmpty(title)) {
           if (ContextItem.IsNew)
              title = "new record";
           else
              title = string.Format("{0} {1}", ContextItem.FirstName,
ContextItem.LastName);
        }
         if (width < 50 || height < 50)
         {//just set some default value to avoid problems
            width = 50;
            height = 50;
         }
        WindowSmartPartInfo partInfo = new WindowSmartPartInfo();
        partInfo.Title = title;
        partInfo.Description = title;
        partInfo.Width = width;
        partInfo.Height = height;
        partInfo.Icon = WorkItem.Services.Get<IResourceService>().GetIcon("application_form_edit");
        return partInfo;
}

A ještě jedna věc. Při aktivaci View v Workspace se musí metoda Show volat bez druhého parametru, tedy takto:

WorkItem.Workspaces[Constants.WorkspaceNames.MdiWorkspace].Show(view);

Jistě zde jsou ještě nevyřešené věci, jako například:

- jak měnit vlastnosti dle potřeby při běhu? Mám jisté indície, budu referovat později.

- co když budu chtít rozšířit vlastností View (lze docílit úpravou WindowSmartPartInfo)? Co všechno se bude muset měnit?


Nový komentář