2016年9月7日水曜日

VB WPF お勉強 10 フォルダ選択ダイアログがない

どうして、WPF には ファイル選択ダイアログはあっても、フォルダ選択ダイアログがないのだろう?。
不思議に思いませんか?。
きっと、何か理由があっての事と思います。
でも、どうしましょうか ... 。


Form から WPF に移って見ると、 その手法の違いに、間誤付いてしまいます。
使い慣れたダイアログが ない !。
ローカルに保存されたファイル群を扱う場合、
当然の事ながら、ファイルやフォルダの選択ダイアログを呼びたいですね。
でも、 ファイルはありますが、 フォルダはありません。

困って、Internet で検索すると、
Form 用のものを流用したり、自前でダイアログを作る方法が Hit します。
でも、でも、 何故か、ピンと来ません。

WPF 設計者の意図を汲めば、きっと、何か理由があって そうなっているのでは と思えて来ます。
そんなもの いらないでしょ ... 、 って、 ね。

思い出しましょう。
フォルダもファイルの一種です。  勿論、同じ様には扱えませんが。
そして、ファイル名をフルパス付で考えれば、 自ずと そこから フォルダ名は取得出来ます。

つまり、こう、です。
ファイル保存ダイアログを流用して、 新規ファイル名を与え、結果から、パスを取得すれば、それが求めるフォルダになります。
新規ファイル名は、つまり、架空の名前で、それを保存する訳ではありません。
保存作業は、ダイアログ操作に続くコードが、役割を担う訳ですから。
保存作業の代わりに、 パスを切り出す作業をすれば良いのです。

では、簡単なサンプルを。
この例では、架空のファイルを GetFolderName. とします。  拡張子はなしです。
ファイル名命名規則に則ったものであれば、何でも OK です。  無論、漢字でも。.

では、コードを。                             下記の 重要 注記. も参照。 *1.
Button と TextBox を配置し、各々に、命名しただけです。

Class MainWindow

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    End Sub

    Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
        Dim fileDlg As New Microsoft.Win32.SaveFileDialog
        'Dim folderDlg2 As New System.Windows.Forms.FolderBlowserDialog

        fileDlg.FileName = "GetFolderName."
        fileDlg.CheckFileExists = False
        fileDlg.Title = Me.Title & "   Select Folder"
        Dim selectedFolder As String = ""
        If fileDlg.ShowDialog() = True Then
            selectedFolder = IO.Path.GetDirectoryName(fileDlg.FileName)
            Me.TextBox1.Text = selectedFolder
        End If

    End Sub
End Class



この方法では、新規フォルダを選択する事も可能です。
ダイアログ上で作っていますので、 既に存在しているフォルダになります。

この方法の長所は、
選択するフォルダにどんなファイルが保存されているか分かる事です。

この方法の欠点は、
ダイアログの ボタンの名称が 保存(S)  Save になっていて、 違和感を覚える事です。
そして、 該当フォルダ の選択は、
親フォルダの中に表示されるものではなく、 実際に該当フォルダを開く(展開する) 必要がある事です。


重要 注記. *1.

  ご存知の通り、各ユーザーには ファイルへのアクセス権が割り当てられています。

  フォルダ選択の後の作業内容に応じて、 上記 Code の
     Dim fileDlg As New Microsoft.Win32.SaveFileDialog
  を、
     Dim fileDlg As New Microsoft.Win32.OpenFileDialog
  に書き換える必要があります。

  こうする事で、 より広範囲のフォルダを対象に操作が行えます。
  読み取りは多くのフォルダやファイルに権限が与えられていますので、
  上記 Code のままでは、 User Profile 配下に転送されてしまう可能性があります。




次の投稿の最後にシリーズのリンクを纏めてあります。   VB WPF お勉強 01 印象



[2016/12/24] Code への注記を追記 *1.

0 件のコメント:

コメントを投稿