2011年4月8日金曜日

CommentOut アクティビティ

MSDN から提供されている WF のサンプルの中にある一つで、Workflow 上に配置できるけど処理を行わないというものです。使い方としては、既存 Workflow 上のアクティビティを削除するのではなく、一時的に処理対象外にしたい場合に利用します。サンプルは C# のみで、Express エディションではソリューションを読み込めないのですが、物としては Express エディションで利用可能な作りですので VB 用に移植したソースを張り付けておきます。

まずはアクティビティのデザイナから。WPF ユーザーコントロールを新規追加し以下のコードを XAML 側に貼り付けます。WPF ユーザーコントロールなのは Express エディションに Workflow 関係のテンプレートは用意されていないからです。通常の Visual Studio でしたら用意されているテンプレートである「アクティビティ」を利用してください。

  1: <sad:ActivityDesigner x:Class="CommentOutActivityDesigner"
  2:     x:Uid="CommentOutDesigner"
  3:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5:     xmlns:sad="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
  6:     xmlns:sa="clr-namespace:System.Activities;assembly=System.Activities">
  7: 
  8:     <sad:ActivityDesigner.Resources>
  9:         <ResourceDictionary x:Uid="ResourceDictionary_1">
 10:             <DataTemplate x:Uid="DataTemplate_1" x:Key="ExpandedCommentOutTemplate">
 11:                 <Border x:Uid="Border_1" BorderThickness ="1">
 12:                     <sad:WorkflowItemPresenter
 13:                         x:Uid="sad:WorkflowItemPresenter_1"
 14:                         AutomationProperties.AutomationId="Body"
 15:                         Item="{Binding Path=ModelItem.Body, Mode=TwoWay}"
 16:                         AllowedItemType="{x:Type sa:Activity}"
 17:                         HintText="ここにアクティビティをドロップ"
 18:                         Margin="5,5,5,5" />
 19:                 </Border>
 20:             </DataTemplate>
 21:             <DataTemplate x:Uid="DataTemplate_6" x:Key="CollapsedActivityViewTemplate">
 22:                 <Label x:Uid="TextBlock_6" Padding="0,0,0,0" FontStyle="Italic"
 23:                        Foreground="{x:Static SystemColors.GrayTextBrush}" HorizontalAlignment="Center"
 24:                        VerticalAlignment="Center">ダブルクリックして表示します</Label>
 25:             </DataTemplate>
 26:             <Style x:Uid="Style_1" x:Key="CommentOutStyle" TargetType="{x:Type ContentPresenter}">
 27:                 <Setter x:Uid="Setter_1" Property="ContentTemplate" Value="{DynamicResource CollapsedActivityViewTemplate}" />
 28:                 <Style.Triggers>
 29:                     <DataTrigger x:Uid="DataTrigger_1" Binding="{Binding Path=ShowExpanded}" Value="true">
 30:                         <Setter x:Uid="Setter_2" Property="ContentTemplate" Value="{DynamicResource ExpandedCommentOutTemplate}" />
 31:                     </DataTrigger>
 32:                 </Style.Triggers>
 33:             </Style>
 34:         </ResourceDictionary>
 35:     </sad:ActivityDesigner.Resources>
 36:     <ContentPresenter x:Uid="ContentPresenter_1" Style="{DynamicResource CommentOutStyle}" Content="{Binding}" />
 37: </sad:ActivityDesigner>
 38: 
 39: 


次にロジック部。



  1: Partial Public Class CommentOutActivityDesigner
  2: 
  3:     Public Sub New()
  4:         ' この呼び出しはデザイナーで必要です。
  5:         InitializeComponent()
  6:     End Sub
  7: 
  8: End Class


この二つを貼り付ける事で ActivityDesigner 側は完了です。

続いて Activity 本体ですが、コメントアウトというだけあって非常に簡単です。



  1: Imports System.Activities
  2: Imports System.ComponentModel
  3: Imports System.Windows.Markup
  4: 
  5: <Designer(GetType(CommentOutActivityDesigner))>
  6: <ContentProperty("BODY")>
  7: Public Class CommentOutActivity
  8:     Inherits CodeActivity
  9: 
 10:     Public Property Body As Activity
 11: 
 12:     Protected Overrides Sub Execute(ByVal context As System.Activities.CodeActivityContext)
 13: 
 14:     End Sub
 15: End Class


Designer 属性を利用して Activity が利用する ActivityDesginer を指定するのは、通常のカスタムコントロールと同様です。また ConetentProperty 属性で指定する内容は、このアクティビティの子要素が何の要素に該当するか、を指定します。今回は BODY と指定していますので、このCommentOut アクティビティの子要素は BODY プロパティの値となることを表します。



Execute メソッドはコメントアウトしたいアクティビティ動作なので何も処理を記述しません。



WF4-1



デザイナー上に配置するとこのように見えます。

0 件のコメント:

コメントを投稿