程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WF4.0工作流設計器

WF4.0工作流設計器

編輯:關於.NET

在WF3.0裡面,就能將工作流設計器宿主到你自己的應用程序中,但是除了做 一些基本的操作,做一些復雜的操作將非常的難。

在WF4.0中應用移植性變得更好,只需200行代碼就能創建一個功能完全也非 常有用的工作流設計器。

WorkflowDesigner

WorkflowDesigner是工作流設計器運行的主類。它通過View屬性給出了實際 的設計界面。通過PropertyInspectorView 屬性給出了相關屬性。如果宿主在 WPF中,這兩個屬性准備給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:

另外一件需要做的事情是注冊流程活動設計的metadata;它只是一個簡單的 調用,但是如果捨棄它,就意味著所有活動都只是一個收起的小圖像,也不可能 擴展。

new DesignerMetadata().Register();

將Activity顯示在工具欄上

左邊的工具欄使用另外一個標准的WPF控件:ToolboxControl。它也非常容易 添加到WPF的表單上面。將Activity的類型添加 ToolboxItemWrapper。這樣,不 需要做其它工作,就能將Activity直接拖放到設計界面上。在下面的代碼只是通 過掃描幾個程序集得到所有Activity類型,如果它是有效的Activity,我們就將 它添加到工具欄上。

代碼

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

在表單的頂部,我顯示當前選擇的activity和它的父Activity。 WorkflowDesigner有一個項目集合,裡面有一組有用的對象。其中有一個就是 Selection 對象,我們可以周期性地檢查此Selection,使用Subscribe()函數和 在一個handler中傳遞,當selection改變的時候就會觸發,這樣可能更容易實現 。

_workflowDesigner.Context.Items.Subscribe<Selection> (SelectionChanged);

Handler一樣也不復雜:

代碼

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

驗證workflow

讓用戶知道設計的工作流是否有效是非常完美的事情。這也非常簡單,在 WorkflowDesigner services中添加一個IValidationErrorService。在這個例子 中,我在表單上添加一個listbox。讓 IValidationErrorService將每項錯誤添 加到ListBox項中。不需要去調用任何函數,一旦工作流有改變, IValidationErrorService會被自動的調用。

var validationErrorService = new ValidationErrorService (WorkflowErrors.Items);
_workflowDesigner.Context.Services.Publish<IValidationErrorService& gt;(validationErrorService);

IValidationErrorService由一個簡單的函數組成。將錯誤寫在一個參數列表 中。

代碼

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);
         }
     }
}

運行workflow:

為了運行工作流,我添加一些代碼,使用WorkflowApplication來運行工作流 。加載也非常容易,ActivityXamlServices.Load()需要傳遞一個文件來調用。 它會返回一個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();

參考文章; http://msmvps.com/blogs/theproblemsolver/archive/2009/12/23/rehosting -the-workflow-designer-in-wf4.aspx

出處:http://zhuqil.cnblogs.com

代碼: http://files.cnblogs.com/zhuqil/2543.CustomWorkflowDesigner_47FBA3A3.z ip

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved