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.Set和System.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如前所述.
该System.Activities命名空间属于Windows工作流基础.此命名空间中的活动类用于构建工作流,例如SharePoint工作流.
该StateMachine班是几个孩子的活动,一起形成一个容器状态机工作流.
定义工作流后,可以使用工作流引擎使用WorkflowInvoker或运行它WorkflowApplication.来自文档:
WorkflowInvoker提供了一种调用工作流的简单方法,就像它是一个方法调用一样,只能用于不使用持久性的工作流.WorkflowApplication为执行工作流提供了更丰富的模型,包括生命周期事件,执行控制,书签恢复和持久性的通知.
在ActivityContext你指的保留有关工作流运行时的信息,如执行该活动的主持人.运行时填写信息,这样您就无法自己注入一些东西.
你找不到使用StateMachine该类的例子的原因是,大多数工作流是使用创建.XAML文件的图形设计器构建的,我不认为很多只使用代码构建.
现在,考虑到所有这些,你可以看到,对于你的场景,这不是一个很好的选择,当然不是为撤消/重做用例设计的.
有框架/库,可能是更好的选择,像这样从PostSharp.
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |