轉(zhuǎn)帖|其它|編輯:郝浩|2011-08-31 15:12:17.000|閱讀 810 次
概述:上一篇,我用實(shí)例講解了在.NET Framework 3.0(3.5)中如何動(dòng)態(tài)加載xoml創(chuàng)建和運(yùn)行流程的做法。這一篇談一下在WF 4.0中的情況,首先介紹一下WF 4的一些重要變化.
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
上一篇,我用實(shí)例講解了在.NET Framework 3.0(3.5)中如何動(dòng)態(tài)加載xoml創(chuàng)建和運(yùn)行流程的做法。這一篇談一下在WF 4.0中的情況,首先介紹一下WF 4的一些重要變化.
1. WF 4中,默認(rèn)就是用xaml(注意,不是xoml),同時(shí)不允許包含c#代碼
2. WF 4中,不再區(qū)分順序工作流和狀態(tài)機(jī)工作流
3. WF 4中,不再能直接使用Code Activity,如果希望寫代碼,則需要編寫一個(gè)自定義的Activity,繼承Code Activity
我接下來(lái)還是用一個(gè)例子講解一下如何在WF 4中動(dòng)態(tài)加載xaml工作流的做法吧
1. 創(chuàng)建自定義的Activity
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
namespace WorkflowConsoleApplication1
{
public sealed class MyActivity : CodeActivity
{
// Define an activity input argument of type string
public InArgument<string> Text { get; set; }
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
string text = context.GetValue(this.Text);
Console.WriteLine(text);
}
}
}
2.將這個(gè)自定義的Activity添加到流程中
設(shè)置它的Text屬性
3.將工作流的屬性進(jìn)行一些修改
注意,將BuildAction設(shè)置為Content,同時(shí)Copy to Output Directory 設(shè)置為Copy always, 并且將Custom Tool設(shè)置為空白
完成操作之后,得到的xaml文件如下
<Activity mc:Ignorable="sap" x:Class="WorkflowConsoleApplication1.Workflow1" sap:VirtualizedContainerService.HintSize="240,240" mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation" xmlns="//schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:local="clr-namespace:WorkflowConsoleApplication1" xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="//schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml">
<local:MyActivity sad:XamlDebuggerXmlReader.FileName="D:\temp\WorkflowConsoleApplication1\WorkflowConsoleApplication1\Workflow1.xaml" sap:VirtualizedContainerService.HintSize="200,200" Text="Hello,World" />
</Activity>
4. 通過(guò)下面的代碼創(chuàng)建并且運(yùn)行流程
using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;
using System.Activities.XamlIntegration;
namespace WorkflowConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
WorkflowInvoker.Invoke(ActivityXamlServices.Load("workflow1.xaml"));
}
}
}
運(yùn)行上述代碼,我們會(huì)遇到一個(gè)錯(cuò)誤
這是為什么呢?MyActivity找不到?
我們應(yīng)該手工將xaml文件成下面這樣。請(qǐng)注意粗體的部分,我添加了assembly的設(shè)置
<Activity mc:Ignorable="sap" x:Class="WorkflowConsoleApplication1.Workflow1" sap:VirtualizedContainerService.HintSize="240,240" mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation" xmlns="//schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:local="clr-namespace:WorkflowConsoleApplication1;assembly=WorkflowConsoleApplication1" xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="//schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml">
<local:MyActivity sad:XamlDebuggerXmlReader.FileName="D:\temp\WorkflowConsoleApplication1\WorkflowConsoleApplication1\Workflow1.xaml" sap:VirtualizedContainerService.HintSize="200,200" Text="Hello,World" />
</Activity>
我個(gè)人認(rèn)為這應(yīng)該算是一個(gè)bug。但目前的情況就是這樣,如果你的自定義Activity是在當(dāng)前應(yīng)用程序里面,則也是需要設(shè)置Assembly的信息的。
當(dāng)然,如果自定義Activity是單獨(dú)的Assembly,則應(yīng)該默認(rèn)就會(huì)寫上Assembly信息,那種情況反而是沒(méi)有問(wèn)題的。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園