WF+WCF+WPF第一天--理解概念性的东西

今年由于项目原因需要用到 WF+WCF+WPF 因此准备认真学习下WF,准备每天写下一篇博文作为自己学习WF的一个反馈。

首先,了解下这三个东西的来源:

WF的全称是Windows Workflow Foundation ,最早在2004年的时候,那时微软推出了一个CTP版的开发包,WinFX.在WinFX中提供了三个内容: Avalon, Indigo, WinOE;与微软很多的技术一样,WinFX在Bata2后就没有后续了. WinFX在2006年以Net 3.0 的方式正式发布了,在NET 3.0 中:

Avalon成为了Windows Presentation Foundation 简称为WPF

Indigo成为了 Windows Communication Foundation 简称为WCF

WinOE 成为了 Windows Workflow Foundation 简称为WF

后来, 微软基于WPF推出了WFP/E, WFP/E就是silverlight的前身.

以上为这三个东西的起源。按照微软的设计者三者本来就是一体的,下面我们开始第一个WF的尝试:

本例是已这篇文章为蓝本的 :  http://www.cnblogs.com/zhuqil/archive/2010/05/14/Hello-World.html

接下来我们做点小小的改动:

用户输入帐号密码,通过工作流请求服务器取得验证结果

代码如下:

<Activity mc:Ignorable="sap sap2010 sads" x:Class="WF.Business.Activity1"
 xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 xmlns:mca="clr-namespace:Microsoft.CSharp.Activities;assembly=System.Activities"
 xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel"
 xmlns:sads="http://schemas.microsoft.com/netfx/2010/xaml/activities/debugger"
 xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"
 xmlns:sap2010="http://schemas.microsoft.com/netfx/2010/xaml/activities/presentation"
 xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
 xmlns:sco="clr-namespace:System.Collections.ObjectModel;assembly=mscorlib"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
    <x:Property Name="returnValue" Type="OutArgument(x:String)" />
    <x:Property Name="UserId" Type="InArgument(x:String)" />
    <x:Property Name="UserPwd" Type="InArgument(x:String)" />
  </x:Members>
  <sap2010:ExpressionActivityEditor.ExpressionActivityEditor>C#</sap2010:ExpressionActivityEditor.ExpressionActivityEditor>
  <sap2010:WorkflowViewState.IdRef>WF.Business.Activity1_1</sap2010:WorkflowViewState.IdRef>
  <TextExpression.NamespacesForImplementation>
    <sco:Collection x:TypeArguments="x:String">
      <x:String>System</x:String>
      <x:String>System.Collections.Generic</x:String>
      <x:String>System.Data</x:String>
      <x:String>System.Linq</x:String>
      <x:String>System.Text</x:String>
      <x:String>System.ServiceModel.Activities</x:String>
    </sco:Collection>
  </TextExpression.NamespacesForImplementation>
  <TextExpression.ReferencesForImplementation>
    <sco:Collection x:TypeArguments="AssemblyReference">
      <AssemblyReference>Microsoft.CSharp</AssemblyReference>
      <AssemblyReference>System</AssemblyReference>
      <AssemblyReference>System.Activities</AssemblyReference>
      <AssemblyReference>System.Core</AssemblyReference>
      <AssemblyReference>System.Data</AssemblyReference>
      <AssemblyReference>System.Runtime.Serialization</AssemblyReference>
      <AssemblyReference>System.ServiceModel</AssemblyReference>
      <AssemblyReference>System.ServiceModel.Activities</AssemblyReference>
      <AssemblyReference>System.Xaml</AssemblyReference>
      <AssemblyReference>System.Xml</AssemblyReference>
      <AssemblyReference>System.Xml.Linq</AssemblyReference>
      <AssemblyReference>mscorlib</AssemblyReference>
      <AssemblyReference>WF.Business</AssemblyReference>
    </sco:Collection>
  </TextExpression.ReferencesForImplementation>
  <Sequence sap2010:WorkflowViewState.IdRef="Sequence_1">
    <Sequence.Variables>
      <Variable x:TypeArguments="p:CorrelationHandle" Name="_handle1" />
    </Sequence.Variables>
    <WriteLine sap2010:WorkflowViewState.IdRef="WriteLine_1" Text="开始请求服务器!" />
    <p:Send x:Name="__ReferenceID0" sap2010:WorkflowViewState.IdRef="Send_1" OperationName="Login" ServiceContractName="IService1">
      <p:Send.CorrelationInitializers>
        <p:RequestReplyCorrelationInitializer>
          <p:RequestReplyCorrelationInitializer.CorrelationHandle>
            <InArgument x:TypeArguments="p:CorrelationHandle">
              <mca:CSharpValue x:TypeArguments="p:CorrelationHandle">_handle1</mca:CSharpValue>
            </InArgument>
          </p:RequestReplyCorrelationInitializer.CorrelationHandle>
        </p:RequestReplyCorrelationInitializer>
      </p:Send.CorrelationInitializers>
      <p:Send.Endpoint>
        <p:Endpoint AddressUri="http://localhost:8001/Service1">
          <p:Endpoint.Binding>
            <p:BasicHttpBinding Name="basicHttpBinding" />
          </p:Endpoint.Binding>
        </p:Endpoint>
      </p:Send.Endpoint>
      <p:SendParametersContent>
        <InArgument x:TypeArguments="x:String" x:Key="userId">
          <mca:CSharpValue x:TypeArguments="x:String">UserId</mca:CSharpValue>
        </InArgument>
        <InArgument x:TypeArguments="x:String" x:Key="userPwd">
          <mca:CSharpValue x:TypeArguments="x:String">UserPwd</mca:CSharpValue>
        </InArgument>
      </p:SendParametersContent>
    </p:Send>
    <p:ReceiveReply Request="{x:Reference __ReferenceID0}" DisplayName="ReceiveReplyForSend" sap2010:WorkflowViewState.IdRef="ReceiveReply_2">
      <p:ReceiveParametersContent>
        <OutArgument x:TypeArguments="x:String" x:Key="LoginResult">
          <mca:CSharpReference x:TypeArguments="x:String">returnValue</mca:CSharpReference>
        </OutArgument>
      </p:ReceiveParametersContent>
    </p:ReceiveReply>
    <WriteLine sap2010:WorkflowViewState.IdRef="WriteLine_2" Text="工作流结束!" />
    <sads:DebugSymbol.Symbol>dzBEOlxTYWtlXERhdGFDb250ZXh0U2FtcGxlXFdGLkJ1c2luZXNzXExvZ2luLnhhbWwLLgNWDgIBATIFMlACAR8zBUwOAgEPTQVTFgIBBFQFVE4CAQIyQzJNAgEgSQtJUAIBGjgPOGACARVGC0ZPAgEQUAtQXAIBBVRDVEsCAQM=</sads:DebugSymbol.Symbol>
  </Sequence>
  <sap2010:WorkflowViewState.ViewStateManager>
    <sap2010:ViewStateManager>
      <sap2010:ViewStateData Id="WriteLine_1" sap:VirtualizedContainerService.HintSize="257,63" />
      <sap2010:ViewStateData Id="Send_1" sap:VirtualizedContainerService.HintSize="257,94" />
      <sap2010:ViewStateData Id="ReceiveReply_2" sap:VirtualizedContainerService.HintSize="257,94" />
      <sap2010:ViewStateData Id="WriteLine_2" sap:VirtualizedContainerService.HintSize="257,63" />
      <sap2010:ViewStateData Id="Sequence_1" sap:VirtualizedContainerService.HintSize="279,558">
        <sap:WorkflowViewStateService.ViewState>
          <scg:Dictionary x:TypeArguments="x:String, x:Object">
            <x:Boolean x:Key="IsExpanded">True</x:Boolean>
          </scg:Dictionary>
        </sap:WorkflowViewStateService.ViewState>
      </sap2010:ViewStateData>
      <sap2010:ViewStateData Id="WF.Business.Activity1_1" sap:VirtualizedContainerService.HintSize="319,638" />
    </sap2010:ViewStateManager>
  </sap2010:WorkflowViewState.ViewStateManager>
</Activity>

  WPF:

对原有界面添加一个TextBox、PasswordBox(PS:这里我使用了Win8的界面风格)

xaml代码:

 1 <m2:MetroWindow x:Class="WPF.HelloWord.LoginMetroWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:m2="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
 5         xmlns:ctrl="clr-namespace:PT.Desktop.Controls;assembly=PT.Desktop"
 6         xmlns:prism="http://www.codeplex.com/prism"
 7         xmlns:tb="http://www.hardcodet.net/taskbar"
 8         xmlns:helloWord="clr-namespace:WPF.HelloWord"
 9         Title="请登陆" Height="300" Width="309" WindowStartupLocation="CenterScreen">
10     <Window.BindingGroup>
11         <BindingGroup></BindingGroup>
12     </Window.BindingGroup>
13     <Grid Margin="0,27,0,-30">
14         <Grid.ColumnDefinitions>
15             <ColumnDefinition Width="150"></ColumnDefinition>
16         </Grid.ColumnDefinitions>
17         <Grid.RowDefinitions>
18             <RowDefinition Height="Auto" />
19             <RowDefinition Height="Auto" />
20             <RowDefinition />
21             <RowDefinition Height="Auto" />
22         </Grid.RowDefinitions>
23         <Label Content="用户名:" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0" Margin="0,17.013,8,8.987" Grid.RowSpan="2"></Label>
24         <TextBox  Name="TxtUserid"  Text="{Binding UserName,Mode=TwoWay, UpdateSourceTrigger=Explicit}" Height="23" Margin="142,17,-142,8.837" Grid.RowSpan="2"/>
25         <Label Content="密   码:" VerticalAlignment="Center" Grid.Row="1" Grid.Column="0" Margin="0,17.039,0,204.204" HorizontalAlignment="Left" Width="142" Grid.RowSpan="2" />
26         <PasswordBox Name="PwdUser"  helloWord:PasswordBoxBindingHelper.IsPasswordBindingEnabled="True"
27                      helloWord:PasswordBoxBindingHelper.BindedPassword="{Binding UserPwd, Mode=TwoWay, UpdateSourceTrigger=Explicit}"
28                       Grid.Row="1" Height="23" Margin="142,18.6,-142,202.48" Grid.RowSpan="2"
29                       PasswordChanged="PasswordBox_OnPasswordChanged"/>
30
31         <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,28.5,-218,142.663" Grid.Row="2" Width="300" Height="50">
32             <Button x:Name="BtnCancel" Content="取  消 " Width="75" Height="23" Click="BtnCancel_OnClick" Margin="0,12.5"/>
33              <Button x:Name="BtnOk" Content="登  陆" IsDefault="True" Width="75" Height="23" Click="BtnOk_OnClick" Margin="0,12.5"/>
34         </StackPanel>
35     </Grid>
36
37 </m2:MetroWindow>

对于BtnOK的点击事件代码如下

1 private void BtnOk_OnClick(object sender, RoutedEventArgs e)
2         {
3               Dictionary<string,object> dict =new Dictionary<string,object>();
4               dict.Add("UserId",this.TxtUserid.Text);
5               dict.Add("UserPwd",this.PwdUser.Password);
6               IDictionary<string, object> results = WorkflowInvoker.Invoke(new Activity1(),dict );
7
8             MessageBox.Show(results["returnValue"].ToString());
9         }

Activity1 就是我们上文所定义的工作流,工作流中设定了2个输入参数:UserId 和 UserPwd;

1  <x:Members>
2     <x:Property Name="returnValue" Type="OutArgument(x:String)" />
3     <x:Property Name="UserId" Type="InArgument(x:String)" />
4     <x:Property Name="UserPwd" Type="InArgument(x:String)" />
5   </x:Members>

因此在执行WF的时候需要 需要带入参数。

完整的WPF C#代码如下:

 1 using System;
 2 using System.Activities;
 3 using System.Collections;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Reflection;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows;
10 using System.Windows.Controls;
11 using System.Windows.Data;
12 using System.Windows.Documents;
13 using System.Windows.Input;
14 using System.Windows.Media;
15 using System.Windows.Media.Imaging;
16 using System.Windows.Shapes;
17 using MahApps.Metro.Controls;
18 using WF.Business;
19
20 namespace WPF.HelloWord
21 {
22     /// <summary>
23     /// StudentView.xaml 的交互逻辑
24     /// </summary>
25     public partial class LoginMetroWindow : MetroWindow
26     {
27         public LoginMetroWindow()
28         {
29             InitializeComponent();
30         }
31
32
33
34         private void BtnOk_OnClick(object sender, RoutedEventArgs e)
35         {
36               Dictionary<string,object> dict =new Dictionary<string,object>();
37               dict.Add("UserId",this.TxtUserid.Text);
38               dict.Add("UserPwd",this.PwdUser.Password);
39               IDictionary<string, object> results = WorkflowInvoker.Invoke(new Activity1(),dict );
40
41             MessageBox.Show(results["returnValue"].ToString());
42         }
43
44         private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
45         {
46             this.Close();
47         }
48
49         private void PasswordBox_OnPasswordChanged(object sender, RoutedEventArgs e)
50         {
51             PasswordBox passwordtext = (PasswordBox) sender;
52             SetPasswordBoxSelection(passwordtext, passwordtext.Password.Length + 1, passwordtext.Password.Length + 1);
53         }
54
55         private static void SetPasswordBoxSelection(PasswordBox passwordBox, int start, int length)
56         {
57             var select = passwordBox.GetType().GetMethod("Select",
58                             BindingFlags.Instance | BindingFlags.NonPublic);
59
60             select.Invoke(passwordBox, new object[] { start, length });
61         }
62     }
63 }

WCFServer模块:

对原有项目 http://www.cnblogs.com/zhuqil/archive/2010/05/14/Hello-World.html  的WCFProject 添加一个login 函数

时间: 2024-11-08 03:58:58

WF+WCF+WPF第一天--理解概念性的东西的相关文章

WF+WCF+WPF第三天-WF实现一个软件自动测试框架

WF是一组顺序活动组成的流程,那么我们可以通过WF流程去实现自动化测试了:比如让WF自动去点击页面,对对应的控件输入值,自动的做些人为的操作. 模拟测试,而我们只要定制测试流程即可. 参考来源:http://www.cnblogs.com/zhuqil/archive/2010/04/20/TestflowFramework.html (来自麒麟大神的博客) 框架实现: StartFlow类用于流程的启动 Extensions类是框架中比较核心的一个扩展类:有两个方法GetForm 和GetCo

WF+WCF+WPF第四天-WF动画效果

本例子改造了 麒麟大神,原文地址:http://www.cnblogs.com/zhuqil/archive/2010/04/21/MoveFlow.html 效果: 活动: 水平移动:HorizontalMove 垂直移动:VerticalMove 流程: 水平跑-垂直跑-水平跑-反向水平跑-反向垂直跑-反向水平跑 界面: 界面是用Win8风格做的 实现:实现很简单,将WPF中的动画做参数传到流程当中.再根据流程图移动. 总结:我正在努力学习WF4.0技术,希望大家给点意见和支持,谢谢. 代码

WF+WCF+WPF第二天--模拟超市收银

跟着麒麟大神的帖子一步步学习: http://www.cnblogs.com/zhuqil/archive/2010/04/16/WF4CashRegister.html 构造个Product类 1 public class ProductItem 2 { 3 public decimal ProductPrice { get; set; } 4 public int ProductNumber { get; set; } 5 public string ProductName { get; s

wcf wpf

转 http://blog.csdn.net/thunder09/article/details/5792157 WPF就是所谓下一代Windows界面层技术,我觉得还有满有前途的.不过Vista发布以来,用户认可度目前确实不高(2009年).只支持win7和vista. WCF,你就先把它想成Web Service的下一代也没什么问题. WPF用过,就算是winform的下一代吧,绘图的话可以实现GDI+一些达不到的效果,国内的书籍资料很少,也就三四本(2009年). WCF(Windows

WPF 正確理解ContentPresenter

我們先由下圖來看類層次,可知ContentControl繼承Control,ContentPresenter繼承FrameworkElement(Control也繼承FrameworkElement);同樣的,ItemsControl繼承Control,ItemsPresenter繼承FrameworkElement. 在Control類並沒有Content屬性, 所以在這之上再寫了一個ContentControl, 使控件有Content屬性可以顯示內容, 而 ContentPresenter

(转)css中通常会用到浮动与清除,也是一个必须掌握的知识点,概念性的东西不多说,下面举几个例子,来说明它的用法:1.文字环绕效果 2.多个div并排显示 3.清除浮动(默认显示)

一.文字环绕效果: html代码如下: 1 <body> 2 3 <style type="text/css"> 4 #big img {float: left;padding: 10px;border: 1px solid red;} 5 #big span {font-size: 24px;font-weight: bold; margin: 0 auto;} 6 </style> 7 <div id="big">

通过一个WPF实例进一步理解委托和事件

在前写过"浅谈C#中的委托"和"浅谈C#中的事件"两篇博客,内容有些抽象,似乎难以说明委托和事件的关系. 今天通过一个小程序来进一步说明二者的使用及联系. 首先新建一个WPF应用程序,取名TestDelegateAndEvent. 在.xmal中加入四个按钮,并添加Window_Loaded事件. 代码如下: <Window x:Class="TestDelegateAndEvent.MainWindow" xmlns="http

一个新手学习WCF的第一个实例

一.概述 WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Client端是通过何种方式来匹配呢?就是通过匹配Service端暴露出的终结点,既然是匹配,那就说明终结点有一定的属性,这就是我们说的ABC: A=address(地址) B=Binding(绑定) C=Contract(契约) 怎么来让大家更通俗的了解ABC呢?这里我引用园里的一位老师的的一个例子: 有

PostgreSQL Replication之第一章 理解复制概念(2)

1.2不同类型的复制 现在,您已经完全地理解了物理和理论的局限性,可以开始学习不同类型的复制了. 1.2.1 同步和异步复制 我们可以做的第一个区分是同步复制和异步复制的区别. 这是什么意思呢?假设我们有两台服务器,希望从一台服务器(the master)复制数据到第二台服务器(the slave).下图说明了同步和异步复制的概念: 我们可以使用一个简单的事务如下所示: BEGIN: INSERT INTO foo VALUES ('bar'); COMMIT; 在异步复制的情况下,事务被提交到