2011年10月27日木曜日

WF4 と WF4.5 における XAML 出力の違い

WF4 と WF4.5 では出力される xaml ファイルの中身がかなり異なっています。それに伴い、WF4 での一部問題も解決されています。

例えば Sequence アクティビティの中に WriteLine アクティビティを置いただけのワークフローにインポートの設定を行ったものを xaml に出力した場合、WF4 と WF4.5 ではこのように出力の違いがあります。まずは WF4 の場合です。

image

デザイナ上ではこのような形で設定したものを出力して比較しました。

   1: <Activity mc:Ignorable="sap" x:Class="Sequence" 
   2:   sap:VirtualizedContainerService.HintSize="277,240" 
   3:   mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" 
   4:   xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" 
   5:   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
   6:   xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" 
   7:   xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" 
   8:   xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" 
   9:   xmlns:swf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
  10:   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  11:   <Sequence sap:VirtualizedContainerService.HintSize="237,200" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces">
  12:     <sap:WorkflowViewStateService.ViewState>
  13:       <scg:Dictionary x:TypeArguments="x:String, x:Object">
  14:         <x:Boolean x:Key="IsExpanded">True</x:Boolean>
  15:       </scg:Dictionary>
  16:     </sap:WorkflowViewStateService.ViewState>
  17:     <WriteLine sap:VirtualizedContainerService.HintSize="215,64" />
  18:   </Sequence>
  19: </Activity>

続いて WF4.5 の場合です。

   1: <Activity mc:Ignorable="sap sap2010 sads" x:Class="Sequence" sap2010:WorkflowViewState.IdRef="Sequence_2"
   2:  xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
   3:  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   4:  xmlns:sads="http://schemas.microsoft.com/netfx/2010/xaml/activities/debugger"
   5:  xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"
   6:  xmlns:sap2010="http://schemas.microsoft.com/netfx/2010/xaml/activities/presentation"
   7:  xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
   8:  xmlns:sco="clr-namespace:System.Collections.ObjectModel;assembly=mscorlib"
   9:  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  10:   <TextExpression.NamespacesForImplementation>
  11:     <sco:Collection x:TypeArguments="x:String">
  12:       <x:String>System.Windows.Forms</x:String>
  13:     </sco:Collection>
  14:   </TextExpression.NamespacesForImplementation>
  15:   <TextExpression.ReferencesForImplementation>
  16:     <sco:Collection x:TypeArguments="AssemblyReference">
  17:       <AssemblyReference>System.Windows.Forms</AssemblyReference>
  18:     </sco:Collection>
  19:   </TextExpression.ReferencesForImplementation>
  20:   <Sequence sap2010:WorkflowViewState.IdRef="Sequence_1">
  21:     <WriteLine sap2010:WorkflowViewState.IdRef="WriteLine_1" />
  22:     <sads:DebugSymbol.Symbol>dydDOlxVc2Vyc1xtYWlsX2FoZlxEZXNrdG9wXHNlcXVlbmNlLnhhbWwCFAMXDgIBARUFFUACAQI=</sads:DebugSymbol.Symbol>
  23:   </Sequence>
  24:   <sap2010:WorkflowViewState.ViewStateManager>
  25:     <sap2010:ViewStateManager>
  26:       <sap2010:ViewStateData Id="WriteLine_1" sap:VirtualizedContainerService.HintSize="211,61" />
  27:       <sap2010:ViewStateData Id="Sequence_1" sap:VirtualizedContainerService.HintSize="233,185">
  28:         <sap:WorkflowViewStateService.ViewState>
  29:           <scg:Dictionary x:TypeArguments="x:String, x:Object">
  30:             <x:Boolean x:Key="IsExpanded">True</x:Boolean>
  31:           </scg:Dictionary>
  32:         </sap:WorkflowViewStateService.ViewState>
  33:       </sap2010:ViewStateData>
  34:       <sap2010:ViewStateData Id="Sequence_2" sap:VirtualizedContainerService.HintSize="273,265" />
  35:     </sap2010:ViewStateManager>
  36:   </sap2010:WorkflowViewState.ViewStateManager>
  37: </Activity>

このように WF4 の場合と比較すると、xaml に出力されている内容がかなり増えているのがわかると思います。今回デザイナ上でインポートを行ったのですが、WF4 では名前空間としてインポート指定したアセンブリが記述されるのみとなっています。そのため再度 xaml ファイルを読み込んだ際には自前のロジックにてインポート設定を復旧する必要がありました。

WF4.5 ではインポートの情報も xaml に出力されています。そのおかげで xaml ファイルを再読み込みした場合にはインポート情報も自動で復元されます。

この他にもアクティビティ毎の ID 値が必ず出力されていたりと、細かいところも色々変更されています。このあたりは非常にありがたいバージョンアップではないでしょうか。

0 件のコメント:

コメントを投稿