🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

15422閲覧

Visual Studio 2019 Windowsアプリケーション .NET 5.0でフォルダ選択をする方法

ra-n

総合スコア17

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2021/02/26 14:35

やりたいこと

WPFのプロジェクトでフォルダ選択のダイアログを表示させたい。

Microsoft Visual Studio Community 2019
Version 16.8.6

Windowsアプリケーション
.NET 5.0

言語:C#

やったこと

NuGet を使って WindowsAPICodePack-Shell というパッケージをインストール
→ .NET5.0 に対応していなくてダメでした。

WindowsForm に含まれているフォルダ選択ダイアログを呼び出す
→アセンブリ:System.Windows.Forms の追加方法が分からずできませんでした。
→参照マネージャーに「アセンブリ」タグがなく、追加できませんでした。
https://teratail.com/questions/324914

教えていただきたいこと

・System.Windows.Forms の追加方法
もしくは
・フォルダ選択ダイアログの表示方法

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nyaf

2021/02/26 16:34

「Windowsアプリケーション」ということであれば、 .NET 5.0 でなく .NET Framework (4.x) でもよいのではないでしょうか? .NET Framework であれば System.Windows.Forms を追加する、 WindowsAPICodePack-Shell を使用する等の対応が可能だと思うのですが。
ra-n

2021/02/26 22:33

ご提案ありがとうございます。 他の機能も作ってしまっているので 今から変えるのは難しいというる理由と、 せっかく新しいものが出たのだから勉強したいという理由で .NET 5.0 からは変えない方向で実現方法を探したいと思います。
guest

回答3

0

自己解決

.NET5.0のときWindowsFormsを使いたい場合は、プロジェクトファイル(.csproj)に
<UseWindowsForms>true</UseWindowsForms>」を追加するそうです。

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net5.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project>

これを入れると、C#のソース内で
using System.Windows.Forms;
が使用できました。

※こちらを参考にさせていただきました。
https://imagingsolution.net/program/csharp/dotnet5_windows_forms/dotnetframework2dotnet_winforms/

投稿2021/02/27 00:39

編集2021/02/27 00:44
ra-n

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/02/27 00:48

.NET Core 3.1 以前と方法が変わったのでややこしいですね。つい最近 TN8001 さんか誰かが回答されていたので今回も誰かすぐに回答するだろうと思っていました。
guest

0

とりあえず、Windows API を使用してフォルダ選択ダイアログを表示することはできますね。

C#

1using System.Runtime.InteropServices; 2// 中略 // 3 4namespace WpfApp 5{ 6 public partial class MainWindow : Window 7 { 8 private const int MAX_PATH = 260; 9 private const int BIF_RETURNONLYFSDIRS = 0x01; 10 private const int BIF_EDITBOX = 0x10; 11 private const int BIF_VALIDATE = 0x20; 12 private const int BIF_NEWDIALOGSTYLE = 0x40; 13 14 private delegate int BrowseCallbackProc(IntPtr hwnd, int uMsg, IntPtr lParam, IntPtr lpData); 15 16 [StructLayout(LayoutKind.Sequential)] 17 private struct BROWSEINFO 18 { 19 public IntPtr hwndOwner; 20 public IntPtr pidlRoot; 21 public IntPtr pszDisplayName; 22 [MarshalAs(UnmanagedType.LPTStr)] 23 public string lpszTitle; 24 public uint ulFlags; 25 public BrowseCallbackProc lpfn; 26 public IntPtr lParam; 27 public int iImage; 28 } 29 30 [DllImport("shell32.dll")] 31 private static extern IntPtr SHBrowseForFolder(ref BROWSEINFO lpbi); 32 33 [DllImport("shell32.dll")] 34 [return: MarshalAs(UnmanagedType.Bool)] 35 private static extern bool SHGetPathFromIDListW(IntPtr pidl, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszPath); 36 37 [DllImport("ole32.dll")] 38 private static extern void CoTaskMemFree(IntPtr pv); 39 40 public MainWindow() 41 { 42 InitializeComponent(); 43 } 44 45 private void button_Click(object sender, RoutedEventArgs e) 46 { 47 var bi = new BROWSEINFO(); 48 var helper = new System.Windows.Interop.WindowInteropHelper(this); 49 bi.hwndOwner = helper.Handle; 50 bi.pidlRoot = IntPtr.Zero; 51 bi.pszDisplayName = IntPtr.Zero; 52 bi.lpszTitle = "フォルダ選択"; 53 //bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_VALIDATE | BIF_NEWDIALOGSTYLE; 54 bi.ulFlags = BIF_EDITBOX | BIF_VALIDATE | BIF_NEWDIALOGSTYLE; 55 bi.lpfn = null; 56 bi.lParam = IntPtr.Zero; 57 IntPtr pid = SHBrowseForFolder(ref bi); 58 if(pid != IntPtr.Zero) 59 { 60 var buff = new StringBuilder(MAX_PATH); 61 if(SHGetPathFromIDListW(pid, buff)) 62 { 63 MessageBox.Show(buff.ToString(), "テスト", MessageBoxButton.OK, MessageBoxImage.Information); 64 } 65 CoTaskMemFree(pid); 66 } 67 } 68 } 69}

投稿2021/02/27 00:21

編集2021/02/27 00:24
Nyaf

総合スコア108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ra-n

2021/02/27 01:06

SHBrowseForFolderという方法があるのですね。 こちらはダイアログを自作するということになるのでしょうか・・・? 勉強になりました。 ありがとうございました。
guest

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ra-n

2021/02/26 22:27

ご回答ありがとうございます。 こちらのサイトには、私がすでに確認している ・NuGet を使って WindowsAPICodePack-Shell というパッケージをインストール ・WindowsForm に含まれているフォルダ選択ダイアログを呼び出す の紹介以外には方法がないように思ったのですが・・・。 私の理解が足らず、見逃しているところがあれば お教えいただけると助かります。
y_waiwai

2021/02/26 22:33

> フォルダー参照ダイアログは残念ながら Microsoft.Win32 名前空間に存在しないので System.Windows.Forms.dll への参照を追加して使います。(Windows フォーム と同じ) との記述がありますが、これではダメでしょうか。
ra-n

2021/02/27 00:34

教えていただいた方法「System.Windows.Forms.dll への参照を追加して」ですが >アセンブリ:System.Windows.Forms の追加方法が分からずできませんでした。 >参照マネージャーに「アセンブリ」タグがなく、追加できませんでした。 という理由でできませんでした。 別の方法で解決できたので、自己解決方法を記載しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問