2017年8月7日月曜日

VB Folder Browser Dialog for WPF

以前、WPF には フォルダ選択ダイアログが無い! と書きました。
ファイル選択ダイアログを流用して、選択が可能な事も 書きました。
しかし、その気になれば、
NuGet から dll を入手して、 実現する事も可能です。


その NuGet のものは、 Windows API Code Pack です。
Windows 7 の頃に公開された、機能拡張用の dll です。
その後、一部機能は、.Netframework に登用されました。
今回の フォルダ選択ダイアログ も、 その Pack の中にあります。


先ずは、
WPF で Solution/Project 作成して下さい。
仮に、名称は WpfApplication3 としましょうか。
次に、 Tools > NuGet Package Maneger > Package Maneger Console を開きます。
そして、以下のコマンドを発行します。

     Install-Package WindowsAPICodePack-Shell -Version 1.1.1

すると、依存関係のある WindowsAPICodePack-Core も引っ張って来てくれます。  但し、最新版ではなく古い方。
    参考:
    Windows API Code Pack - Core 1.1.2   https://www.nuget.org/packages/WindowsAPICodePack-Core/
    Windows API Code Pack - Shell 1.1.1   https://www.nuget.org/packages/WindowsAPICodePack-Shell/

Each package is licensed to you by its owner. Microsoft is not responsible for, nor does it grant any licenses to, third-party packages. Some packages may include dependencies which are governed by additional licenses. Follow the package source (feed) URL to determine any dependencies.

Package Manager Console Host Version 2.12.0.817

Type 'get-help NuGet' to see all available NuGet commands.

PM> Install-Package WindowsAPICodePack-Shell -Version 1.1.1
Attempting to resolve dependency 'WindowsAPICodePack-Core (≥ 1.1.1)'.
Installing 'WindowsAPICodePack-Core 1.1.1'.
Successfully installed 'WindowsAPICodePack-Core 1.1.1'.
Installing 'WindowsAPICodePack-Shell 1.1.1'.
Successfully installed 'WindowsAPICodePack-Shell 1.1.1'.
Adding 'WindowsAPICodePack-Core 1.1.1' to WpfApplication3.
Successfully added 'WindowsAPICodePack-Core 1.1.1' to WpfApplication3.
Adding 'WindowsAPICodePack-Shell 1.1.1' to WpfApplication3.
Successfully added 'WindowsAPICodePack-Shell 1.1.1' to WpfApplication3.

PM>

これで、準備完了。
この状態で、Project に packages.config が作られ、packages フォルダ配下に dll が格納されます。
後は、 普通にコードを書いて行きます。


xaml
<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button Dlg" HorizontalAlignment="Left" Margin="222,61,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
        <TextBlock x:Name="TextBlock1" HorizontalAlignment="Left" Margin="115,115,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
    </Grid>
</Window>

VB code-behind
Imports Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialog

Class MainWindow

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

    End Sub

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim dlg As New Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog
        dlg.IsFolderPicker = True           'Default:False
        Dim result As Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialogResult = dlg.ShowDialog()
        If result = Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialogResult.Ok Then
            Me.TextBlock1.Text = dlg.FileName
        End If
    End Sub

End Class


序なので、 依存関係のある もの (...-Core) を最新版に変えて置きましょう。
あらあら、 Solition が開かれていないと、 怒られてしまいました。  遣り直し。

Type 'get-help NuGet' to see all available NuGet commands.

PM> Install-Package WindowsAPICodePack-Core -Version 1.1.2
Install-Package : The current environment doesn't have a solution open.
At line:1 char:1
+ Install-Package WindowsAPICodePack-Core -Version 1.1.2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Install-Package], InvalidOperationException
    + FullyQualifiedErrorId : NuGetNoActiveSolution,NuGet.PowerShell.Commands.InstallPackageCommand


PM> Install-Package WindowsAPICodePack-Core -Version 1.1.2
Installing 'WindowsAPICodePack-Core 1.1.2'.
Successfully installed 'WindowsAPICodePack-Core 1.1.2'.
Removing 'WindowsAPICodePack-Core 1.1.1' from WpfApplication3.
Successfully removed 'WindowsAPICodePack-Core 1.1.1' from WpfApplication3.
Adding 'WindowsAPICodePack-Core 1.1.2' to WpfApplication3.
Successfully added 'WindowsAPICodePack-Core 1.1.2' to WpfApplication3.
Uninstalling 'WindowsAPICodePack-Core 1.1.1'.
Successfully uninstalled 'WindowsAPICodePack-Core 1.1.1'.

これで、 無事に、 フォルダ選択ダイアログ と ご対面 !。
あったのですね。  !。


さて、 こうすれば使える事は分かりました。
でも、 実際の出番は あるのかな? ... 。



少し、脱線しますね。

今回の フォルダ選択ダイアログ も、 標準で提供される Win32.OpenFileDialog & Win32.SaveFileDialog も、
詰まる処、 Explorer そのもの です。
個人に割り当てられた権限の下、 何でも出来てしまいます。

間違って、 新規フォルダを作る事も遣れますし、 ファイルやフォルダの 削除・名称変更 も可能です。
全選択 は便利に使わせて貰っています。
慣れていれば、至極、便利な存在ですが、
例えば、間違ってボタンを押して、新規フォルダが現れたら ... 、焦りますよね。  特に、最初は。
削除も可能なので、 そこで訂正すれば良いのですが、
もし、パニックになっていたら、 ぐちゃぐちゃにしてしまうかも知れません。
ファイルやフォルダを選択するだけの心算が、 塵のフォルダを作っていた ... 何て結末に出会うかも。
後日、気が付く、 作った記憶の無い  新規フォルダ ... 。

でも、 これに対処しようとすると ... 。
いやぁ、 難しいですね。
なんせ、 Explorer そのもの ですから ... 。

皆さん なら、 どうします?。



0 件のコメント:

コメントを投稿