2011年6月2日木曜日

デザイナ上で複数行コメントを入力可能なアクティビティ

Twitter 上で @koty さんからこのような話が出たので作ってみました。
確かにデザイナ上というかワークフロー上にコメント的なものが用意できると見た目にわかりやすくなるなー、と思いながらとりあえず的な物としてですが・・・。

マルチコメント1

今回はデザイナー上で直接入力も行いたかったので、デザイナーの XAML とアクティビティのソースを記載します。


   1: <sad:ActivityDesigner x:Class="MultilineCommentActivityDesigner"
   2:     x:Uid="MultilineCommentActivityDesigner"
   3:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   4:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   5:     xmlns:s="clr-namespace:System;assembly=mscorlib"
   6:     xmlns:sad="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
   7:     xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation"
   8:     xmlns:sadc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation"
   9:     xmlns:sa="clr-namespace:System.Activities;assembly=System.Activities">
  10:  
  11:     <sad:ActivityDesigner.Resources>
  12:         <ResourceDictionary>
  13:             <sadc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" />
  14:         </ResourceDictionary>
  15:     </sad:ActivityDesigner.Resources>
  16:     
  17:     <Grid>
  18:         <sapv:ExpressionTextBox 
  19:                   Expression="{Binding Path=ModelItem.CommentStrings, Mode=TwoWay, 
  20:                                                  Converter={StaticResource ArgumentToExpressionConverter}, 
  21:                                                  ConverterParameter=In }"
  22:                   ExpressionType="s:String"
  23:                   OwnerActivity="{Binding Path=ModelItem}" 
  24:                   AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />
  25:     </Grid>
  26:  
  27: </sad:ActivityDesigner>

XAML 部分はこのような感じです。ExpressionTextBox を一つぺたっよ貼り付けて複数行入力可能にしてみた感じですね。続いてはアクティビティ本体のソースです。

   1: Imports System.Activities
   2: Imports System.ComponentModel
   3:  
   4: <Designer(GetType(MultilineCommentActivityDesigner))>
   5: Public Class MultilineCommentActivity
   6:     Inherits CodeActivity
   7:  
   8:     Public Property CommentStrings As InArgument(Of String)
   9:  
  10:     Protected Overrides Sub Execute(ByVal context As System.Activities.CodeActivityContext)
  11:     End Sub
  12:  
  13:     Protected Overrides Sub CacheMetadata(metadata As System.Activities.CodeActivityMetadata)
  14:     End Sub
  15:  
  16: End Class

ポイントは CacheMetadata メソッドをオーバライドして処理を何も行わない 点です。デザイナ上での検証エラーは上記メソッドにて発生しますので、ここを何もしないようにしています。最初に貼り付けたスクリーンショットでも、アクティビティとしてはエラーがない状態になっているのがわかると思います。

ただし。

マルチコメント2

実際にはやはりエラーになっていますので、プロパティダイアログから見に行くとこのような事に・・・w

ですがアクティビティ自体はエラー無という扱いになっていますので、問題なくワークフローの実行等は行えます。

2 件のコメント:

  1. ありがとうございます。
    VisualStudioのデザイナ上だと、無駄に整形されちゃうんですよね。
    テスト的なコメント
       テスト的なコメント()
    という風に。。。リホスティングデザイナだと大丈夫。まったく、VisualStudioは余計なことしてくれます。かわりに(?)インテリセンスが使えるのが良い点でしょうか。

    返信削除
  2. @kotyさんコメントありがとうございます。

    インテリセンスも一応リホスティングにて利用できるのですが、自前でそれを用意するとなるとなかなか手間なのが難点です。ただ、調べていると色々可能性が見えてくるのでいつかは挑戦してみたいところですね。

    返信削除