WF4.0 Beta1 流程设计器与Activity Designer

public class myData

{

public string 结果

{ set; get; }

 

public string 说明

{ set; get; }

}

 

 

自定义Activity

public sealed class 节点<T> : NativeActivity<myData>

{

public 节点()

: base()

{

this.DisplayName = "";

 

}

 

string _n = "mywait";

public string 节点名

{

get { return _n; }

set { _n = value; }

}

 

string _s = "请输入内容";

public string 内容

{

get { return _s; }

set { _s = value; }

}

 

protected override void Execute(ActivityExecutionContext context)

{

System.Console.WriteLine("内容:{0}", 内容);

context.CreateNamedBookmark(节点名, new BookmarkCallback(bookmarkCallback));

}

 

void bookmarkCallback(ActivityExecutionContext context, Bookmark bookmark, object obj)

{

myData r = obj as myData;

 

if (r.结果 == "a")

{

System.Console.WriteLine("{0},请处理以下问题:", r.说明);

}

this.Result.Set(context, r);

}

}

 

自定义Designer

<sad:WorkflowElementDesigner x:Class="WpfApplication1.myDesigner"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:sad="clr-namespace:System.Activities.Design;assembly=System.Activities.Design"

xmlns:sadv="clr-namespace:System.Activities.Design.View;assembly=System.Activities.Design">

 

<sad:WorkflowElementDesigner.Resources>

 

<DataTemplate x:Key="d1">

<StackPanel>

<TextBlock Margin="0,5,0,0" Text="内容:" />

<TextBox Height="50" AcceptsReturn="True" Text="{Binding Path=ModelItem.内容}" />

</StackPanel>

 

</DataTemplate>

 

</sad:WorkflowElementDesigner.Resources>

 

<Grid >

<ContentPresenter ContentTemplate="{DynamicResource d1}" Content="{Binding}"/>

</Grid>

</sad:WorkflowElementDesigner>

 

流程设计器

<Window x:Class="WpfApplication1.Window1"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Window1" >

<StackPanel>

<StackPanel Orientation="Horizontal" >

<Button Content="启动流程" Width="80" Height="30" Click="Button_Click" />

<TextBlock Margin="20,0,0,0" Text="办理" />

 

<Button Name="yes" Content="同意" Width="80" Height="30" Click="yes_Click" />

<Button Name="nextUser" Content="交指定人再议" Width="80" Height="30" Click="nextUser_Click" />

<TextBox Name="tb" Width="200" />

</StackPanel>

 

<StackPanel Orientation="Horizontal" Loaded="StackPanel_Loaded">

 

<StackPanel xmlns:sad="clr-namespace:System.Activities.Design;assembly=System.Activities.Design">

<StackPanel Name="propertyPanel" />

<sad:ToolboxControl Width="250" Height="400" Name="toolbox" />

</StackPanel>

<ContentControl Height="800" Width="800" Name="desienerPanel" />

</StackPanel>

</StackPanel>

</Window>

public partial class Window1 : Window

{

public Window1()

{

InitializeComponent();

}

WorkflowDesigner designer;

private void StackPanel_Loaded(object sender, RoutedEventArgs e)

{

ToolboxCategoryItemsCollection toolList=new ToolboxCategoryItemsCollection("基本工具");

toolbox.Categories.Add(toolList);

toolList.Add(new ToolboxItemWrapper(typeof(节点<myData>), "节点"));

toolList.Add(new ToolboxItemWrapper(typeof(System.Activities.Statements.FlowSwitch), "分支"));

toolList.Add(new ToolboxItemWrapper(typeof(System.Activities.Statements.WriteLine), "输出"));

//======

 

DesignerMetadata dm = new DesignerMetadata();

dm.Register();

//-

 

AttributeTableBuilder builder = new AttributeTableBuilder();

builder.AddCustomAttributes(typeof(节点<myData>), new DesignerAttribute(typeof(myDesigner)));

MetadataStore.AddAttributeTable(builder.CreateTable());

 

//==========

 

designer = new WorkflowDesigner();

 

var root = new System.Activities.Statements.Flowchart();

 

var v = new System.Activities.Variable<myData>();

v.Name = "content";

v.Default = new myData();

root.Variables.Add(v);

designer.Load(root);

 

desienerPanel.Content=designer.View;

propertyPanel.Children.Add(designer.PropertyInspectorView);

}

 

WorkflowInstance myInstance;

public WorkflowInstance createInstanceFromXamlString(string xaml)

{

System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();

byte[] bs = utf8.GetBytes(xaml);

System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bs);

WorkflowElement activity = WorkflowXamlServices.Load(memoryStream);

WorkflowInstance myInstance = new WorkflowInstance(activity);

return myInstance;

}

 

 

 

private void Button_Click(object sender, RoutedEventArgs e)

{

System.Console.Clear();

myInstance = createInstanceFromXamlString(designer.Text);

myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs ee) { System.Console.WriteLine("end"); };

myInstance.Run();

}

 

 

private void yes_Click(object sender, RoutedEventArgs e)

{

myData date = new myData();

date.结果 = "a";

date.说明 = tb.Text;

 

myInstance.ResumeBookmark("mywait", date);

}

 

private void nextUser_Click(object sender, RoutedEventArgs e)

{

myData date = new myData();

date.结果 = "b";

date.说明 = tb.Text;

myInstance.ResumeBookmark("mywait", date);

}

}

 

 

设计流程

设计如下流程

WF4.0 Beta1 流程设计器与Activity Designer

 

 

WF4.0 Beta1 流程设计器与Activity Designer

 

 

 

WF4.0 Beta1 流程设计器与Activity Designer

 

WF4.0 Beta1 流程设计器与Activity Designer

 

WF4.0 Beta1 流程设计器与Activity Designer

 

 

运行说明

WF4.0 Beta1 流程设计器与Activity Designer

 

WF4.0 Beta1 流程设计器与Activity Designer

 

WF4.0 Beta1 流程设计器与Activity Designer

WF4.0 Beta1 流程设计器与Activity Designer

相关文章: