2012年3月7日水曜日

標準の ActivityDesigner を利用する場合のデザイナ上アイコン

以前にアクティビティのアイコンについて、アクティビティデザイナーを持たない場合のアイコン抽出として ToolboxBitMap 属性を抽出する方法を書きました。その際に懸念事項として、デザイナ上のアイコンをどうするか、というのがありましたが色々と試行錯誤したところ、次のような手法になるのではないかと思います。

結論から言えば「何らかのアクティビティデザイナーを用意するしかない」となりました。

これは Designer 属性を付与されていないアクティビティは強制的に ActivityDesigner クラスを利用する形になりそこで指定されている標準アイコンを利用してしまうためです。そこを考えると、何かしらのアクティビティデザイナーを持たせるのが最も単純な方法、ということになります。ただし、xaml でアクティビティデザイナーを定義する必要はなく、全てコードで済ますことが可能です。

   1: Imports System.Activities
   2: Imports System.Activities.Presentation
   3: Imports System.Drawing
   4: Imports System.Windows.Media
   5: Imports System.Windows
   6: Imports System.Windows.Media.Imaging
   7:  
   8: Public MustInherit Class DesignerBase
   9:     Inherits ActivityDesigner
  10:  
  11:     Protected Property IconFileName As String = ""
  12:  
  13:     Protected Sub SetResourceIcon()
  14:         Try
  15:             Dim resStream = Me.GetType.Module.Assembly.GetManifestResourceStream(
  16:                                          Me.GetType, Me.IconFileName)
  17:             Dim resFrame = BitmapFrame.Create(resStream)
  18:  
  19:             Me.Icon = New DrawingBrush With {
  20:                 .Drawing = New ImageDrawing With {
  21:                     .Rect = New Rect(0, 0, 16, 16),
  22:                     .ImageSource = resFrame
  23:                 }
  24:             }
  25:         Catch ex As Exception
  26:  
  27:         End Try
  28:     End Sub
  29:  
  30: End Class

このようなベースとなるアクティビティデザイナークラスを作成し、

   1: Public Class GetUserAgentStringsActivityDesigner
   2:     Inherits DesignerBase
   3:  
   4:     Public Sub New()
   5:         Me.IconFileName = "GetUserAgentStringsActivity.png"
   6:         Me.SetResourceIcon()
   7:     End Sub
   8:  
   9: End Class

各アクティビティ固有のデザイナクラスとしては、上記実装だけで設定が可能です。今回のサンプルでは、利用するアクティビティのアイコンを「埋め込まれたリソース」として定義してある状態にて作成しています。このような形で個別にアイコンの設定を行います。

DesignerIcon

そうすることで、上記のようにデザイナ側でもアイコンを表示する事ができます。デザイナ上で操作する部分が不要な場合は今回のような手法を用いる事で、アイコンの設定を行えます。デザイナ上で何もすることがないのに、xaml で定義を行うのはどうもイヤだ、という気持ちもありますので、今回の方法は利用しやすいのではないでしょうか。

0 件のコメント:

コメントを投稿