首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 4.0 工作流設計器重新裝載實作

     編輯:關於.NET

WF 3.0 可將設計器裝載於自訂應用程式,但複雜操作困難。WF 4.0 移植性大幅提升,約 200 行程式碼即可建立功能完整的工作流設計器。

WorkflowDesigner 核心類別

WorkflowDesigner 為設計器主類別。View 屬性提供設計介面,PropertyInspectorView 提供屬性視窗。WPF 裝載時直接加入 UIElement。載入/儲存工作流使用 Load()/Save() 搭配 XAML 檔案。

_workflowDesigner = new WorkflowDesigner();
_workflowDesigner.Load(_fileName);
var view = _workflowDesigner.View;
Grid.SetColumn(view, 1); Grid.SetRow(view, 1);
LayoutGrid.Children.Add(view);
var propInspector = _workflowDesigner.PropertyInspectorView;
Grid.SetColumn(propInspector, 2); Grid.SetRow(propInspector, 1);
LayoutGrid.Children.Add(propInspector);

DesignerMetadata 註冊

必須註冊活動設計中繼資料,否則活動僅顯示為摺疊圖示無法展開:

new DesignerMetadata().Register();

工具箱顯示活動

使用標準 WPF ToolboxControl。將活動型別包裝為 ToolboxItemWrapper 加入類別,即可拖曳至設計面。掃描組件取得所有有效活動型別:

var toolbox = new ToolboxControl();
var cat = new ToolboxCategory("Standard Activities");
var assemblies = new List<Assembly>();
assemblies.Add(typeof(Send).Assembly);
assemblies.Add(typeof(Delay).Assembly);
assemblies.Add(typeof(ReceiveAndSendReplyFactory).Assembly);
var query = from asm in assemblies
            from type in asm.GetTypes()
            where type.IsPublic && !type.IsNested && !type.IsAbstract
                  && !type.ContainsGenericParameters
                  && (typeof(Activity).IsAssignableFrom(type) || typeof(IActivityTemplateFactory).IsAssignableFrom(type))
            orderby type.Name
            select new ToolboxItemWrapper(type);
query.ToList().ForEach(ti => cat.Add(ti));
toolbox.Categories.Add(cat);
Grid.SetColumn(toolbox, 0); Grid.SetRow(toolbox, 1);
LayoutGrid.Children.Add(toolbox);

目前選取項目顯示

表單頂部顯示目前選取活動及其父活動。訂閱 Selection 變更事件:

_workflowDesigner.Context.Items.Subscribe<Selection>(SelectionChanged);
private void SelectionChanged(Selection selection) {
    var modelItem = selection.PrimarySelection;
    var sb = new StringBuilder();
    while (modelItem != null) {
        var displayName = modelItem.Properties["DisplayName"];
        if (displayName != null) {
            if (sb.Length > 0) sb.Insert(0, " - ");
            sb.Insert(0, displayName.ComputedValue);
        }
        modelItem = modelItem.Parent;
    }
    CurrentActivityName.Text = sb.ToString();
}

工作流驗證

發布 IValidationErrorService 至設計器服務,自動於 ListBox 顯示錯誤:

var validationErrorService = new ValidationErrorService(WorkflowErrors.Items);
_workflowDesigner.Context.Services.Publish<IValidationErrorService>(validationErrorService);
public class ValidationErrorService : IValidationErrorService {
    private IList _errorList;
    public ValidationErrorService(IList errorList) { _errorList = errorList; }
    public void ShowValidationErrors(IList<ValidationErrorInfo> errors) {
        _errorList.Clear();
        foreach (var error in errors) _errorList.Add(error.Message);
    }
}

執行工作流

使用 WorkflowApplication 執行,ActivityXamlServices.Load() 載入 XAML 回傳 DynamicActivity:

var writer = new StringWriter();
var workflow = ActivityXamlServices.Load(_fileName);
var wa = new WorkflowApplication(workflow);
wa.Extensions.Add(writer);
wa.Completed = WorkflowCompleted;
wa.OnUnhandledException = WorkflowUnhandledException;
wa.Run();

參考文章:MSDN MVP Blog
原始碼下載:CustomWorkflowDesigner.zip

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved