2011年4月14日木曜日

Activity のプロパティダイアログで[ファイルを開く]ダイアログの表示

元ネタは海外の BBS から。ファイル名を指定するようなアクティビティを作ろうとした場合、やはり [ファイルを開く] ダイアログを利用して指定させたいというのはあると思います。そのような場合には以下のような感じで実装します。

・DialogPropertyValueEditor を継承したクラスを用意する

  1: Imports System.Activities
  2: Imports System.Activities.Presentation
  3: Imports System.Windows.Forms
  4: 
  5: Public Class FileBrowserDialogPropertyValueEditor
  6:     Inherits PropertyEditing.DialogPropertyValueEditor
  7: 
  8:     Private _res As New ExecuteOtherWorkflowActivityDesigner
  9: 
 10:     Public Sub New()
 11:         Me.InlineEditorTemplate = TryCast(_res.Resources("FileBrowserInlineEditorTemplate"), DataTemplate)
 12:     End Sub
 13: 
 14:     Public Overrides Sub ShowDialog(ByVal propertyValue As System.Activities.Presentation.PropertyEditing.PropertyValue, ByVal commandSource As System.Windows.IInputElement)
 15: 
 16:         Using dlg As New OpenFileDialog
 17:             With dlg
 18:                 .AddExtension = True
 19:                 .CheckFileExists = True
 20:                 .Multiselect = False
 21:                 .Filter = "ワークフロー(*.xaml)|*.xaml|全てのファイル(*.*)|*.*"
 22: 
 23:                 If .ShowDialog = DialogResult.OK Then
 24:                     propertyValue.StringValue = dlg.FileName
 25:                 End If
 26:             End With
 27:         End Using
 28: 
 29:     End Sub
 30: 
 31: End Class


このクラスはプロパティダイアログ上での入力時にどのような挙動をさせるかを記述するクラスとなっています。コンストラクタで、InlineEditorTemplate プロパティに何やら DataTemplate を設定していますが、これがプロパティダイアログ上で表示されるものとなります。今回は面倒だったので、アクティビティで利用するデザイナ上に定義したものを呼び出していますw



  1: <DataTemplate x:Uid="DataTemplate_1" x:Key="FileBrowserInlineEditorTemplate">
  2:     <Border x:Uid="Border_1" BorderThickness ="1">
  3:         <Grid>
  4:             <Grid.ColumnDefinitions>
  5:                 <ColumnDefinition Width="1*"/>
  6:                 <ColumnDefinition Width="Auto"/>
  7:             </Grid.ColumnDefinitions>
  8:             <TextBox Grid.Column="0" Text="{Binding StringValue}"/>
  9:             <sapp:EditModeSwitchButton Grid.Column="1"/>
 10:         </Grid>
 11:     </Border>
 12: </DataTemplate>
 13: 


そのテンプレートの内容はこのような感じにしてあります。テキストボックスはそのままとして EditModeSwitchButton が [...] ボタンの表示を行います。余談ですがこのテンプレートをアクティビティ側に適用した場合、何故か VS によく出てくるピンボタンに変化します。



・アクティビティの対象となるプロパティに Editor 属性を付加する



このように作成したクラスを対象となるプロパティに Editor 属性を利用して設定します。



  1: <Browsable(True)>
  2: <Editor(GetType(FileBrowserDialogPropertyValueEditor), GetType(DialogPropertyValueEditor))>
  3: Public Property WorkflowFile As String


このような感じで設定します。



このように実装したアクティビティを利用するとこのように表示されます。



fileDialog



WorkflowFile プロパティの欄にテキストボックスとボタンが表示されているのが見えると思います。このボタンをクリックすると [ファイルを開く] ダイアログが表示され、そこで選択したファイル名がプロパティの値として設定されるようになります。



このようにアクティビティのプロパティについては、プロパティダイアログ上での入力もカスタマイズできる手段が提供されています。

0 件のコメント:

コメントを投稿