在C#或VB.NET中使用'System.Activities.Statements.StateMachine'类的示例

Ele*_*ios 3 .net c# vb.net state-machine undo-redo

我觉得有必要要求System.Activities.Statements.StateMachine类的完全合格的示例用法来存储和恢复Control实例的状态(这意味着,我想存储一个Control的状态来替换典型的基于控件属性和"命令"的撤消/重做方法.

我一直在Google上搜索自制的状态机实现,我发现了很多,但后来我在.NET Framework类库中发现了Microsoft的这种实现(那时我现在没有理由依赖任何自制的然而,MSDN没有代码示例来介绍该类的使用,我没有在Google上找到任何证明其用法的结果(以及我看到的一小段代码示例)在MSDN上的一些其他相关成员我根本不理解它应该如何使用它们.

然后,现在我实际上是盲目的,试图通过反复试验来学习如何使用该类及其相关成员.

下面是我试过的那一刻,我坚持意图"注册" obj变量的状态,具体是在System.Activities.OutArgument.SetSystem.Activities.OutArgument.Get方法中,它接受一个ActivityContext作为第一个参数,我不知道我应该传递给他们什么值(在我的代码下面,对这些方法的调用会引发异常,因为该值不能为null).

C#(由在线代码翻译翻译,可能有语法错误):

using System.Activities;
using System.Activities.Statements;

// Create a container for statemachines
StateMachine sm = new StateMachine();

// Declare an object to test its state...
string obj = null;

// Modify the state of 'obj'.
obj = "hello";

// Save 1st state of 'obj'.
Activity<string> act1 = obj;
act1.Result = new OutArgument<string>();
act1.Result.Set(null, obj);
State state1 = new State();
state1.Entry = act1;

// Modify the state of 'obj'.
obj = "hello world";

// Save 2nd state of 'obj'.
Activity<string> act2 = obj;
act2.Result = new OutArgument<string>();
act2.Result.Set(null, obj);
State state2 = new State();
state2.Entry = act2;

// Add saved states into the statemachine collection.
sm.States.Add(state1);
sm.States.Add(state2);

// Modify the state of 'obj'.
obj = string.Empty;

// Restore last saved state of 'obj'.
obj = ((Activity<string>)sm.States.Last().Entry).Result.Get(null);
Run Code Online (Sandbox Code Playgroud)

VB.NET:

Imports System.Activities
Imports System.Activities.Statements

' Create a container for statemachines
Dim sm As New StateMachine()

' Declare an object to test its state...
Dim obj As String

' Modify the state of 'obj'.
obj = "hello"

' Save 1st state of 'obj'.
Dim act1 As Activity(Of String) = obj
act1.Result = New OutArgument(Of String)
act1.Result.Set(Nothing, obj)
Dim state1 As New State()
state1.Entry = act1

' Modify the state of 'obj'.
obj = "hello world"

' Save 2nd state of 'obj'.
Dim act2 As Activity(Of String) = obj
act2.Result = New OutArgument(Of String)
act2.Result.Set(Nothing, obj)
Dim state2 As New State()
state2.Entry = act2

' Add saved states into the statemachine collection.
sm.States.Add(state1)
sm.States.Add(state2)

' Modify the state of 'obj'.
obj = String.Empty

' Restore last saved state of 'obj'.
obj = DirectCast(sm.States.Last().Entry, Activity(Of String)).Result.Get(Nothing)
Run Code Online (Sandbox Code Playgroud)

...还有一些说明Activity<string> act1 = obj;/ Dim act1 As Activity(Of String) = obj我不确定这是否是正确的方式.

PS:请注意,在上面的代码中,我使用了一个String变量只是为了简化操作,但是我需要保存和恢复a的状态,Control如前所述.

Pet*_*ons 5

System.Activities命名空间属于Windows工作流基础.此命名空间中的活动类用于构建工作流,例如SharePoint工作流.

StateMachine班是几个孩子的活动,一起形成一个容器状态机工作流.

定义工作流后,可以使用工作流引擎使用WorkflowInvoker或运行它WorkflowApplication.来自文档:

WorkflowInvoker提供了一种调用工作流的简单方法,就像它是一个方法调用一样,只能用于不使用持久性的工作流.WorkflowApplication为执行工作流提供了更丰富的模型,包括生命周期事件,执行控制,书签恢复和持久性的通知.

ActivityContext你指的保留有关工作流运行时的信息,如执行该活动的主持人.运行时填写信息,这样您就无法自己注入一些东西.

你找不到使用StateMachine该类的例子的原因是,大多数工作流是使用创建.XAML文件的图形设计器构建的,我不认为很多只使用代码构建.

现在,考虑到所有这些,你可以看到,对于你的场景,这不是一个很好的选择,当然不是为撤消/重做用例设计的.

有框架/库,可能是更好的选择,像这样从PostSharp.