VB のたまご

作成日: 2017/03/06, 更新日: 2017/03/06



FolderBrowserDialog

    イメージ
  •  残念なことに WPF 向けに フォルダを開くダイアログは用意されていません。 ここでは、WinForms で使われる System.Windows.Forms.FolderBrowserDialog を利用して表示しています。

  • スポンサーリンク


  •  FolderBrowserDialog は、ユーザーにフォルダを指定してもらうためのダイアログです。 とりあえずどういう風に動くのか見てみましょう。 以下サンプルです。「FolderBrowserDialogWindow1」という画面で作成していますが、「MainWindow」に書いても構いません。 あらかじめ FolderBrowserDialog を利用するために、参照設定の追加から「System.Windows.Forms.dll」を追加しています。

  • <Window x:Class="FolderBrowserDialogWindow1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:w04_NormalControls"
            mc:Ignorable="d"
            Title="FolderBrowserDialogWindow1" Height="300" Width="300">
    
        <StackPanel>
    
            <Button Content="フォルダを開く" Click="Button_Click" />
            <TextBlock Name="textblock1" />
    
        </StackPanel>
    
    </Window>
    

    ' 参照設定の追加で「System.Windows.Forms.dll」を参照追加しています。
    Imports System.Windows.Forms
    
    Public Class FolderBrowserDialogWindow1
    
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    
            ' WPF の FolderBrowserDialog は存在しないので、WinForms の FolderBrowserDialog を使う
            ' FolderBrowserDialog は System.Windows.Forms を Import により記載省略できるが、
            ' DialogResult は、System.Windows.Forms を省略して記述すると、Window.DialogResult と衝突してしまうし、こちらが優先されてしまう
            ' FolderBrowserDialog に対応する System.Windows.Forms.DialogResult と名前空間付きで記載する必要ありorz
            Dim a = DialogResult
    
            Using dlg = New FolderBrowserDialog
                If dlg.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                    Me.textblock1.Text = dlg.SelectedPath
                Else
                    MessageBox.Show("キャンセルしました")
                End If
            End Using
    
        End Sub
    
    End Class
    

  •  WPF の DialogResult と名前解決がバッティングしており、扱いづらいところが残念です。 ローカル変数の「a」にマウスオーバーすると、Window.DialogResult 型として判定されていることが分かると思います。 実行すると、最低限の情報が記載されたダイアログが表示されるので、フォルダ階層を選びながら任意のフォルダを選択します。

  • スポンサーリンク


  •  もう少し細かい設定をしてみましょう。以下のサンプルです。

  • <Window x:Class="FolderBrowserDialogWindow2"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:w04_NormalControls"
            mc:Ignorable="d"
            Title="FolderBrowserDialogWindow2" Height="300" Width="300">
    
        <StackPanel>
    
            <Button Content="フォルダを開く" Click="Button_Click" />
            <TextBlock Name="textblock1" />
    
        </StackPanel>
        
    </Window>
    

    Public Class FolderBrowserDialogWindow2
    
        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    
            Using dlg = New System.Windows.Forms.FolderBrowserDialog
    
                dlg.Description = "フォルダーを選択してください"
                dlg.ShowNewFolderButton = False
                dlg.RootFolder = Environment.SpecialFolder.MyComputer
    
                If dlg.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                    Me.textblock1.Text = dlg.SelectedPath
                Else
                    MessageBox.Show("キャンセルしました")
                End If
    
            End Using
    
        End Sub
    
    End Class
    

  •  このサンプルでは、フォルダーダイアログの詳細指示とダイアログ内で作成できるフォルダボタンの非表示、初期フォルダの変更など、 さらに細かい設定をおこなっています。