WF4工作流设计器模型对Undo和Redo的支持

简介:

WF4的设计器模型中提供了UndoEngine类,提供设计时的Undo(撤销)和Redo(重做)功能。我们可以调用工作设计器的服务来启用Undo和Redo功能。主要涉及到下面几个类:

clip_image002

下面一个简单例子说明

1.WPF的Xaml部分如下:

<Window x:Class="CaryUndo.MainWindow"

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

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

        xmlns:sadt="clr-namespace:System.Activities.Presentation.Toolbox;assembly=System.Activities.Presentation"

        xmlns:sys="clr-namespace:System;assembly=mscorlib"

        Title="MainWindow" Height="350" Width="525">

    <Window.CommandBindings>

        <CommandBinding Command="Undo" Executed="UndoHandle" />

        <CommandBinding Command="Redo" Executed="RedoHandle" />

    </Window.CommandBindings>

    <Window.Resources>

        <sys:String x:Key="AssemblyName">System.Activities, Version= 4.0.0 .0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</sys:String>

    </Window.Resources>

    <Grid>

        <Grid.ColumnDefinitions>

            <ColumnDefinition Width="2*"/>

            <ColumnDefinition Width="7*"/>

            <ColumnDefinition Width="3*"/>

        </Grid.ColumnDefinitions>

        <Border Grid.Column="0">

            <sadt:ToolboxControl>

                <sadt:ToolboxCategory CategoryName="Basic">

                    <sadt:ToolboxItemWrapper AssemblyName="{StaticResource AssemblyName}" >

                        <sadt:ToolboxItemWrapper.ToolName>

                            System.Activities.Statements.Sequence

                        </sadt:ToolboxItemWrapper.ToolName>

                    </sadt:ToolboxItemWrapper>

                    <sadt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">

                        <sadt:ToolboxItemWrapper.ToolName>

                            System.Activities.Statements.WriteLine

                        </sadt:ToolboxItemWrapper.ToolName>

                    </sadt:ToolboxItemWrapper>                 

                    <sadt:ToolboxItemWrapper  AssemblyName="{StaticResource AssemblyName}">

                        <sadt:ToolboxItemWrapper.ToolName>

                            System.Activities.Statements.Pick

                        </sadt:ToolboxItemWrapper.ToolName>

                    </sadt:ToolboxItemWrapper>

                </sadt:ToolboxCategory>

            </sadt:ToolboxControl>

        </Border>

        <Border Grid.Column="1" Name="DesignerBorder"></Border>

        <Border Grid.Column="2" Name="PropertyBorder"/>

        <Button Content="Undo" Command="Undo" Height="23" HorizontalAlignment="Left" Margin="9,179,0,0" Name="button1" VerticalAlignment="Top" Width="75" />

        <Button Content="Redo" Command="Redo" Height="23" HorizontalAlignment="Left" Margin="9,218,0,0" Name="button2" VerticalAlignment="Top" Width="75" />

    </Grid>

</Window>

2.后台代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.Activities.Presentation;

using System.Activities.Core.Presentation;

using System.Activities.Statements;

 

namespace CaryUndo

{

    public partial class MainWindow : Window

    {

        WorkflowDesigner wd = new WorkflowDesigner();

        UndoEngine undoEngineService; 

 

        public MainWindow()

        {

            InitializeComponent();

        }

 

        protected override void OnInitialized(EventArgs e)

        {

            base.OnInitialized(e);

            // register metadata

            (new DesignerMetadata()).Register();

            // create the workflow designer

            wd.Load(new Sequence());

            DesignerBorder.Child = wd.View;

            PropertyBorder.Child = wd.PropertyInspectorView;

            this.undoEngineService = this.wd.Context.Services.GetService<UndoEngine>();

            this.undoEngineService.UndoUnitAdded += new EventHandler<UndoUnitEventArgs>(OnUndoUnitAdded);

        }

        void OnUndoUnitAdded(object sender, UndoUnitEventArgs e)

        {

            MessageBox.Show("Undo Unit");

        } 

        private void UndoHandle(object sender, ExecutedRoutedEventArgs e)

        {

            this.wd.Context.Services.GetService<UndoEngine>().Undo();

        } 

        private void RedoHandle(object sender, ExecutedRoutedEventArgs e)

        {

            this.wd.Context.Services.GetService<UndoEngine>().Redo();

        }

    } 

}

 

3.我们在自己重新宿主的设计器,增加几个活动后,我们可以支持多步的Undo和Redo动作。如下图:

clip_image004

 

 

 

本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2010/01/05/WF4-Undo.html,如需转载请自行联系原作者

相关文章
|
6月前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版产品使用合集之oracle cdc 抽取新增一张表 可以从savepoint恢复吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在online模式下增量抓取Oracle数据时,在archive_log切换时,出现数据丢失的情况,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 分布式计算 算法
基于 Log 的通用增量 Checkpoint
本文将从 Checkpoint 的性能优化历程出发,介绍 ChangelogStateBackend 的基本机制、应用场景和未来规划,同时介绍最新版本在 State 上的一些优化工作。
7483 2
基于 Log 的通用增量 Checkpoint
|
缓存 监控 Oracle
Oracle检查点(Checkpoint)详解 (文档 ID 1526118.1)
Oracle检查点(Checkpoint)详解 1.检查点概念--chkpoint 检查点是一个数据库事件,存在的意义在于减少崩溃恢复crash recovery时间.检查点事件由后台进程CKPT触发,当检查点发生时,CKPT通知DBWR进程将脏数据库dirtybuffer写出到数据文件上,更新数据文件头及控制文件上的检查点信息。
2950 0
|
SQL 存储 运维
FLIP-147:支持包含结束任务的 Checkpoint 操作与作业结束流程修正
为了完善流执行模式对有限数据流的支持,所进行的改动以及更详细的实现。
FLIP-147:支持包含结束任务的 Checkpoint 操作与作业结束流程修正
|
存储 关系型数据库 MySQL
整体结构&InnoDB数据字典(1) --系统表空间结构(三十三)
整体结构&InnoDB数据字典(1) --系统表空间结构(三十三)
|
Oracle 关系型数据库 数据库
Redo的管理与优化
Oracle优化案例
GPDB · 特性分析 · Segment事务一致性与异常处理
事务一致性 这篇月报Primary和Mirror同步机制讲了Primary和Mirror之间各种数据和文件的同步过程。这些数据和文件的同步,看似彼此独立。那么如何保证某个时间点Mirror的所有数据是一致的,即任何时间点发生HA切换,Mirror都能达到一致性状态并对外提供服务?正如我们前面提到的
1783 0
|
运维 监控 Oracle
3月19日直播【从12c到20c,Oracle多租户之10046跟踪PDB关库案例原理解析】
本次分享将针对DevOps代码质量审核、监控、开发环境测试、生产环境测试这四个方面存在的问题进行剖析并给出解决之道,希望能助您全面转型DevOps。
701 0