WF4设计器模型:编辑范围ModelEditingScope

由于WF4的设计器用WPF来呈现,所以本文的理论也适用于WPF。当你在WF4的设计器中选中某些活动要进行设计工作时,就形成了可编辑的对象. 设计器会传回一个ModelItem的类,该类表示编辑模型中的一个项。项可以是从窗口或控件一直到颜色或整数的任何内容。您可以通过项的 Properties 集合来访问项的属性,并对属性值进行更改。ModelItem 实质是设计器的基础数据模型的一个包装。关于ModelItem的详细介绍可以参考WF4设计器数据模型:ModelItem和ModelProperty这篇文章。

上面说到在WF4的设计器中选中某些活动要进行设计工作时,就形成了可编辑的对象,该对象对应于ModelEditingScope类表示对编辑存储区的一组更改。更改组是事务性的。可以将在一个编辑范围内所做的更改作为一个单元提交或中止。该类主要有下面几个方法:

Bb628866.protmethod(zh-cn,VS.90).gifComplete:完成编辑范围。
Bb628866.protmethod(zh-cn,VS.90).gifOnComplete:执行编辑范围的实际完成操作。
Bb628866.protmethod(zh-cn,VS.90).gifOnRevert:执行编辑范围的实际还原操作。
Bb628866.pubmethod(zh-cn,VS.90).gifRevert:放弃在编辑范围内所做的更改。

下面举一个例子来说明:

1.我们使用WPF来重新宿主WF4的设计器,完成后如下图:

clip_image002

原创地址:http://www.cnblogs.com/carysun/archive/2009/11/27/ModelEditingScope.html

对应的XAML如下:

<Window x:Class="CaryEditingScope.MainWindow"

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

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

        Title="MainWindow" Height="500" Width="700">

    <Grid Name="CaryGrid" >

        <Grid.ColumnDefinitions>

            <ColumnDefinition Width="2*"/>

            <ColumnDefinition Width="7*"/>

            <ColumnDefinition Width="3*"/>

        </Grid.ColumnDefinitions>

        <StackPanel Grid.Column="0">

            <Button Name="Open" Content="打开" Click="Open_Click"></Button>

            <Button Name="Close" Content="关闭" Click="Close_Click"></Button>

            <Button Name="Revert" Content="放弃" Click="Revert_Click"></Button>           

        </StackPanel>

    </Grid>

</Window>

2.我们来介绍下这个程序,程序运行的时候我们会重新宿主WF的设计器,并默认添加两个活动。在点击打开按钮的时候我们会对ModelItem进行更改在添加两个活动,这个时候你不会看到设计器的变化,只有在点击关闭按钮后提交了编辑范围的更改后你会看见设计器上又新增了两个活动。放弃按钮为你在完成编辑范围前放弃更改,后台代码如下:

namespace CaryEditingScope

{

    /// <summary>

    /// Interaction logic for MainWindow.xaml

    /// </summary>

    public partial class MainWindow : Window

    {

        WorkflowDesigner workflowDesigner;

        ModelEditingScope mEditScope;

        public MainWindow()

        {

            InitializeComponent();         

            workflowDesigner = new WorkflowDesigner();

            this.DataContext = this;

            (new DesignerMetadata()).Register();

            workflowDesigner.Load(new Sequence

            {

                Activities =

                            {                            

                                new WriteLine { Text = "" },

                                new Flowchart()

                            }

            });

            Grid.SetColumn(workflowDesigner.View, 1);

            Grid.SetColumn(workflowDesigner.PropertyInspectorView, 2);

            CaryGrid.Children.Add(workflowDesigner.View);

            CaryGrid.Children.Add(workflowDesigner.PropertyInspectorView);

        }

 

        private void Open_Click(object sender, RoutedEventArgs e)

        {

            ModelItem mi = workflowDesigner.Context.Services.GetService<ModelService>().Root;           

            mEditScope= mi.BeginEdit();

            mi.Properties["Activities"].Collection.Add(new WriteLine { Text = "?" });           

            mi.Properties["Activities"].Collection.Add(new Flowchart());

        }

 

        private void Close_Click(object sender, RoutedEventArgs e)

        {

            mEditScope.Complete();

            Revert.IsEnabled = false;

        }

 

        private void Revert_Click(object sender, RoutedEventArgs e)

        {

            mEditScope.Revert();

            Close.IsEnabled = false;

        }

    }

}

3.运行后效果如下:

clip_image002[14]


本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2009/11/27/ModelEditingScope.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值