11/19 に行われた CLR/H 勉強会のレポートです。今回も前回に続き Deep Dive! な回ということもあり、深い話が多い回となりました。

DataGridView や DataRepeater にこだわりつつ
時代は Workflow Foundation などと言い続けていたら
これからは LogicFlow だろ! と思い始めてきた
色々浅く広くやっていく古い技術者の Blog
ある程度 WF の ExpressionTextBox で式や値の入力中にインテリセンスを利用するように実装できてきたので、その利用方法や注意点をまとめてみます。
まず WF での ExpressionTextBox におけるインテリセンスサポートですが、Visual Studio 上でワークフローを触られている場合は Visual Studio が提供するインテリセンスが自動で利用されています。しかし再ホストを行っているケースでは、自前でインテリセンス部分を用意しなくてはいけません。海外 MSDN だと VIsual Studio のアドイン Dll をそのまま利用してしまえという豪快な方法を目にすることがありますが、配布が出来ませんので自分一人の環境で利用する場合のみ許される方式です。
本日 11/19 に行われている CLR/H 第 64 回勉強会にて発表した LT スライドを公開します。今回は WF を利用して WPF アプリを作ってみよう、という題材です。もう少しあれこれできれば、ノベルゲーなら十分作れるんじゃないかな、と思いますw
原則として Workflow Foundation は非同期にて動作しますが、俗に言うマルチスレッドにタスクを分配して動作するような挙動は行いません。Parallel アクティビティというのもありますが、これも内部ではシングルスレッドで動作しており、待ち状態が発生した際に制御を切り替えるというものになっています。
このあたりで色々考える人は多いのですが、海外の Blog ですばらしいサンプルを見つけたので VB に移植してみました。
前回の LocBAML を利用した記事にあるように、現在拙作の WFDesignerExpress を多言語対応(といっても機械翻訳での対応ですが……)を行っています。その際に非常に感じたのは、クラスやプロパティに対して属性を設定するのではなく、IRegisterMetadata.Register メソッドにて属性の設定を行うようにするのが、WPF や WF でのプログラミングを行う際に適している、というところです。
アプリケーションの多言語化対応というのは、人によっては必要な作業だと思います。MSDN でもローカライズ関係の資料が色々と掲載されており、その中の一つの方法として LocBaml ツールを利用したローカライズがあります。
アクティビティを色々作成している中で、次のようなケースがありました。
アクティビティのプロパティとしてファイル名を受け取るとして、そのファイル名で指定された画像をデザイナ上でプレビュー表示をする、というものです。その際にプロパティが String で指定されているのであればまだ簡単なのですが、アクティビティの場合ほとんどのプロパティは InArgument(T) を指定することもあり、値の変換には少し方法を変える必要があります。
WF でファイルやフォルダ操作を行う上で必要性を非常に感じているのが Zip 圧縮。バッチスクリプト等での定型処理でも結構使われているのではないでしょうか。
これを実際に .NET で行おうとすると何種類かの選択肢から方式を選ぶことになると思います。
自分が今まで利用していたのは(1)の方法で、これだと MS 純正コンポーネントのみで済み、かつ結構楽な手段でサンプルもごろごろ転がっていたと思います。ところが、.NET 4 から J# を利用するというのが結構面倒でそのままでは利用できないため WF から利用するのは躊躇していました。
そうなると(2)か(3)なのですが、(2)のように外部ライブラリを利用するのは最も楽で安定するのですが、気持ちとして参照 Dll がどんどん増えていく事が嫌いというのもあり却下。必然的に(3)の方法となってしまいます。
メッセージボックスを表示するアクティビティを作っていて、デザイナ上でアイコンやボタンの設定をラジオボタンにて選択させようとした時、MessageBoxIcon 列挙値を変換するような IValueConverter を用意してあげれば、ラジオボタンにバインドができて非常に楽になります。ただし、その際に少しだけ注意する点がありました。
前回は属性による指定と CacheMetadata メソッド内部での検証ロジック実行という方法を利用しましたが、今回は制約(Constraint)による検証を行ってみます。制約とは MSDN にも記載されている通り「検証ロジックを含むアクティビティ」となっています。そのためコードだけでなく XAML によっての作成も可能です。