前回の LocBAML を利用した記事にあるように、現在拙作の WFDesignerExpress を多言語対応(といっても機械翻訳での対応ですが……)を行っています。その際に非常に感じたのは、クラスやプロパティに対して属性を設定するのではなく、IRegisterMetadata.Register メソッドにて属性の設定を行うようにするのが、WPF や WF でのプログラミングを行う際に適している、というところです。
まぁそれも多言語対応しないのであれば構わないのですが、もし属性でリソースに定義してある値を設定するケースも IRegisterMetadata.Register メソッドで処理を行う必要があります。属性設定では定数でなければならないため、リソースから取得して設定する、という事が許されません。
ロジックとしては次のようになります。
1: Dim builder As New AttributeTableBuilder
2: builder.AddCustomAttributes(GetType(CommentOutActivity),
3: New DesignerAttribute(GetType(CommentOutActivityDesigner)),
4: New ToolboxBitmapAttribute("Images/Activity/commentout.png")
5: )
6: MetadataStore.AddAttributeTable(builder.CreateTable)
以前にも書いた通り、クラスに属性を設定する場合はこのようなロジックで済みます。プロパティに属性を設定する場合では、次のようになります。
1: Dim builder As New AttributeTableBuilder
2: builder.AddCustomAttributes(GetType(ReadKeyActivity),
3: New DesignerAttribute(GetType(ReadKeyActivityDesigner)),
4: New ToolboxBitmapAttribute("Images/Activity/console_readkey.png")
5: )
6: builder.AddCustomAttributes(GetType(ReadKeyActivity), "InputKey",
7: New CategoryAttribute(GetResourceStrings("ACtRKPropertyCategory", "処理の設定")),
8: New DisplayNameAttribute(GetResourceStrings("ACtRKInputKeyProperty", "結果を受取る変数")),
9: New DescriptionAttribute(GetResourceStrings("ACtRKInputKeyDescription", "入力されたキーを受取る変数を設定します。")))
10:
11: MetadataStore.AddAttributeTable(builder.CreateTable)
こちらでは ReadKeyActivity クラスの InputKey プロパティに対して属性を設定しています。
このように IRegisterMetadata.Register メソッド内部で属性を定義するようにしておくことが、WPF や WF でのプログラミングに適した形となっています。というのも、リソース用 Dll に上記メソッドを持つクラスが存在した場合、メソッドを呼び出してあげる事が MS 推奨の方式となっており、Visual Studio でもまず先にこの処理が行われることになっています。
(リソース用 Dll ではなく実行アセンブリの場合は、自分たちで上記メソッドを呼び出す必要があります)
WF ではメタデータに対して多くの情報を登録する必要があり、このあたりの方式を合わせておくことが後々楽になると思います。
0 件のコメント:
コメントを投稿