2 WF設計器
WF設計器的實現思路主要是每個Activity對應的ActivityDesigner和駐留環境(Designer Surface),這也為我們實現基於Web的WF設計器提供了思路,就winform環境和webform環境比較,AcitivityDesinger是不變的,變化的是駐留環境。很長時間沒有接觸WF了,這裡討論的環境是Winfrom下的,以後有機會做的Web環境下再整理吧。
Wf設計器結構
2.1 Activity Designer
Activity關於默認的DesignerAttribute聲明是Designer(typeof(ActivityDesigner), typeof(IDesigner);Designer(typeof(ActivityDesigner), typeof(IRootDesigner)
我們如果實現自定義的Acitivity,一般從Activity繼承就可以了,不需要重新寫。由於ActivityDesigner的設計表現為簡單矩形,所以我們看到的活動都是簡單矩形的樣子,當然我們也可以修改的很漂亮。對應復合活動,如圖,從CompositeActivityDesigner上繼承下來Desinger有好幾個,都有自己的設計表現,其中:ParallelActivityDesigner表現為所有子活動並行;SequenceDesigner表現是自動以順序方式呈現子活動。
如果是特殊的復合活動,可能需要自己實現Desinger。這裡覺的例子是wf本質論上的,大家也可以比較書看一下,電子書是可以免費下載的。例子中要實現自定義的PrioritizedInterleave,設計表現是需要在設計器上表現出優先級關系,由於現有類庫缺乏支持,所以就需要自己實現特點的Acitivity Designer.
如何實現自定義ActivityDesigner
PrioritizedInterleaveDesigner例子中,設計意圖是點自活動可以在PropertyGrid中設置Priority屬性,根據Priority值,子活動位於不特點位置
可以通過PropertyGrid設置屬性
1.IExtenderListService中加入特定IExtenderProvider。見類圖。
2.特定IExtenderProvider實現
通過ProvidePropertyAttribute和PropertyGrid關聯
IExtenderProvider.CanExtend作為是否使用屬性的依據,如果為true,PropertyGrid控件會查找extender類中的Get<PropertyName>,Set<PropertyName>方法,實現和Acivity屬性的交互。
Wf還沒有開源,猜測這裡這裡使用AOP代碼織入並使用了Template模式。
3.Activity的聲明使用自定義的ActivityDesigner。Designer(typeof(自定義ActivityDesigner), typeof(IDesigner)
例子中PrioritizedInterleaveDesigner繼承自CompositeActivityDesigne,所以對PrioritizedInterleave的聲明,實際上對整個復合活動的聲明
CompositeActivityDesigner.ContainedDesigners
右鍵菜單修改屬性
1.實現IDesignerVerbProvider接口
2.初始化活動的時候IDesignerVerbProviderService.AddVerbProvider(IDesignerVerbProvider);
3.接口實現
通過ActivityDesignerVerb.PropertIEs得到Activity
針對這個Activity get並修改後Set
4.PerformLayout使修改生效
修改設計器圖形(復合活動和基礎活動都可以修改)
1.對於復合活動override Glyphs方法,得到ActivityDesignerGlyphCollection
ActivityDesignerGlyphCollection.Add(DesignerGlyph);