【UiPath】カスタムアクティビティのプロパティを見える化する

前回はカスタムアクティビティのアイコンを変更したので、今回は中身の作り込みをします。
※前回＞[[カスタムアクティビティのアイコンを変更する](https://qiita.com/UmegayaRollcake/items/4fe69c00e82402cc478b)]

オートメーションの中で実行時の日付や時刻を取りたいケースはよくありますが、
・`DateTime.Now.ToString("yyyy/MM/dd")`
　のように決まりきったコードを毎回書くのは面倒なので、書式指定だけで済ませたい
・Assignでコード書くと↓のように肝心の書式部分が隠れて見えない
　![assign.png](https://qiita-image-store.s3.amazonaws.com/0/255097/b6a5ce0c-4701-426f-f08a-c105b0efaf30.png)
という理由から、使いやすい日付取得用アクティビティ"Get Now"を作ることにしました。

# Activityクラスの実装
まずはActivityクラスの中身を実装します。といってもやる事は単純。
Inputパラメータに入力された日付書式文字列をDateTimeに与えて結果を返すだけ。

```
[Category("Input")]
[RequiredArgument]
public InArgument<string> Format { get; set; }

[Category("Output")]
public OutArgument<string> ResultString { get; set; }

protected override void Execute(CodeActivityContext context)
{
      string dateTimeString = DateTime.Now.ToString(Format.Get(context));
      ResultString.Set(context, dateTimeString);
}
```
これだけでも動作はするけど、もうひと手間加えてMessage BoxやWrite Lineのようにアクティビティ上に
Inputパラメータを表示させて、設定されている日付書式がひと目でわかるようにしたい。
![workflow.png](https://qiita-image-store.s3.amazonaws.com/0/255097/98488ca2-6249-c2ce-9ed7-02d1092892b4.png)
この赤枠の部分に、入力した日付書式を表示したい。

# パラメータの見える化
ここでもUiPath公式[GitHub](https://github.com/UiPath/Community.Activities)にあるサンプルを参考にします。
その中のScriptActivityDesignerとGoogleSheetApplicationDesignerで使われている、
[ExpressionTextBox](https://msdn.microsoft.com/ja-jp/library/system.activities.presentation.view.expressiontextbox(v=vs.110).aspx)でInputパラメータの見える化を実現できます。

このExpressionTextBoxはアクティビティ上に表示できる式入力用テキストボックスで、
[ArgumentToExpressionConverter](https://msdn.microsoft.com/ja-jp/library/system.activities.presentation.converters.argumenttoexpressionconverter(v=vs.110).aspx)を仲介役にInputパラメータとリンクさせる事ができます。

パラメータは多いですが、使い方はだいたい決まっているようです。
デフォルトで\<Grid>\</Grid>になっていた部分を↓のXAMLコードで置き換えます。

``` GetNowDesigner.xaml
    <sap:ActivityDesigner.Resources>
        <ResourceDictionary>
            <sapc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" />
        </ResourceDictionary>
    </sap:ActivityDesigner.Resources>

    <DockPanel>
        <sapv:ExpressionTextBox OwnerActivity="{Binding Path=ModelItem}" ExpressionType="s:String" 
            HintText="DateTime format, must be quoted." MaxLines="1"
            Expression="{Binding Path=ModelItem.Format, Converter={StaticResource ArgumentToExpressionConverter}, 
            ConverterParameter=In, Mode=TwoWay}"/>
    </DockPanel>
```

UiPath Studioに置くとこうなります。何も入力が無い場合、テキスト部にHintTextが表示されます。
　![getnow.png](https://qiita-image-store.s3.amazonaws.com/0/255097/70b57957-d734-c1ce-98e6-f66d050fefdb.png)

日付書式を入力するとこんな感じ。なぜかちょっとだけ幅が縮む。
　![result.png](https://qiita-image-store.s3.amazonaws.com/0/255097/7317dbab-1830-cfe4-10f5-f6c22b9c667f.png)
そう、これを実現したかったのです。

---
今回はここまで。
これで見た目も中身もオリジナルの、"俺のアクティビティ"を作る事ができたので満足です。

ただ本当は書式の指定をテキスト入力でなく、 □[年] ■[月] ■[日] □[時] □[分] □[秒] のように
欲しい項目をチェックボックスで選択できる形にしたかったのですが、失敗しました。

[(WF4) Showing an InArgument<bool> as a CheckBox in the Workflow Designer Property Grid](https://blogs.msdn.microsoft.com/tilovell/2011/04/06/wf4-showing-an-inargumentbool-as-a-checkbox-in-the-workflow-designer-property-grid/)
を参考に数時間チャレンジしたものの、どうにもプロパティがチェックボックス型にならずあきらめ。

UiPathはWWFベースとはいえ、やっぱり純粋なWWFとはやり方が違うのかなぁ・・・

次回＞[[しゃべるアクティビティを作る](https://qiita.com/UmegayaRollcake/items/bda62d4395ffe1b9aeb0)]