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?