.NET의 동일한 대화 상자에서 파일 또는 폴더를 선택하십시오.
-
06-07-2019 - |
문제
동일한 대화 상자에서 파일이나 폴더를 선택하는 "쉬운"방법이 있습니까?
내가 만든 많은 앱에서 파일이나 폴더를 모두 입력으로 허용합니다. 지금까지 나는 항상 파일 또는 폴더 선택 대화 상자 사이에 전환하기 위해 스위치를 만들거나 드래그 앤 드롭 기능 만 사용합니다.
이것이 기본적인 것으로 보이기 때문에 이것이 이전에 만들어 졌다고 생각할 수 있지만 인터넷 검색은 많은 정보를 초래하지 않습니다. 따라서 처음부터 시작하여 사용자 정의 선택 대화 상자를 만들어야하는 것처럼 보이지만 사소한 작업을 위해 휠을 재창조하여 문제를 일으키지 않습니다.
팁이나 기존 솔루션이 있습니까?
UI를 일관성있게 유지하려면 OpenFiledialog (또는 FolderBrowserDialog)을 확장 할 수 있다면 좋을 것입니다.
해결책
기술적으로 가능합니다. FolderBrowsedialog에서 사용하는 쉘 대화 상자에는 파일과 폴더를 모두 반환 할 수 있습니다. 불행히도, 그 기능은 .NET에 노출되지 않습니다. 반사조차도 필요한 옵션 플래그를 찌를 수 없습니다.
그것을 작동 시키려면 bif_browseincludefiles 플래그가 browseinfo.ulflags (value = 0x4000)에서 켜진 상태에서 shbrowseforfolder ()를 p/호출해야합니다. p/invoke는 칙칙하며 코드를 복사하고 붙여 넣는 것이 가장 좋습니다. 다른 출처 또는 반사기의 도움으로 폴더 브라우드 디디 로그 클래스 자체.
다른 팁
위의 팁을 기반으로 다음 위치에서 표준 폴더 브라우저 대화 상자를 사용하는 작업 코드를 찾았습니다. http://topic.csdn.net/t/20020703/05/845468.html
확장 폴더 브라우저 대화 상자에 대한 클래스
Imports System
Imports System.Text
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Public Class DirectoryDialog
Public Structure BROWSEINFO
Public hWndOwner As IntPtr
Public pIDLRoot As Integer
Public pszDisplayName As String
Public lpszTitle As String
Public ulFlags As Integer
Public lpfnCallback As Integer
Public lParam As Integer
Public iImage As Integer
End Structure
Const MAX_PATH As Integer = 260
Public Enum BrowseForTypes As Integer
Computers = 4096
Directories = 1
FilesAndDirectories = 16384
FileSystemAncestors = 8
End Enum
Declare Function CoTaskMemFree Lib "ole32" Alias "CoTaskMemFree" (ByVal hMem As IntPtr) As Integer
Declare Function lstrcat Lib "kernel32" Alias "lstrcat" (ByVal lpString1 As String, ByVal lpString2 As String) As IntPtr
Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolder" (ByRef lpbi As BROWSEINFO) As IntPtr
Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDList" (ByVal pidList As IntPtr, ByVal lpBuffer As StringBuilder) As Integer
Protected Function RunDialog(ByVal hWndOwner As IntPtr) As Boolean
Dim udtBI As BROWSEINFO = New BROWSEINFO()
Dim lpIDList As IntPtr
Dim hTitle As GCHandle = GCHandle.Alloc(Title, GCHandleType.Pinned)
udtBI.hWndOwner = hWndOwner
udtBI.lpszTitle = Title
udtBI.ulFlags = BrowseFor
Dim buffer As StringBuilder = New StringBuilder(MAX_PATH)
buffer.Length = MAX_PATH
udtBI.pszDisplayName = buffer.ToString()
lpIDList = SHBrowseForFolder(udtBI)
hTitle.Free()
If lpIDList.ToInt64() <> 0 Then
If BrowseFor = BrowseForTypes.Computers Then
m_Selected = udtBI.pszDisplayName.Trim()
Else
Dim path As StringBuilder = New StringBuilder(MAX_PATH)
SHGetPathFromIDList(lpIDList, path)
m_Selected = path.ToString()
End If
CoTaskMemFree(lpIDList)
Else
Return False
End If
Return True
End Function
Public Function ShowDialog() As DialogResult
Return ShowDialog(Nothing)
End Function
Public Function ShowDialog(ByVal owner As IWin32Window) As DialogResult
Dim handle As IntPtr
If Not owner Is Nothing Then
handle = owner.Handle
Else
handle = IntPtr.Zero
End If
If RunDialog(handle) Then
Return DialogResult.OK
Else
Return DialogResult.Cancel
End If
End Function
Public Property Title() As String
Get
Return m_Title
End Get
Set(ByVal Value As String)
If Value Is DBNull.Value Then
Throw New ArgumentNullException()
End If
m_Title = Value
End Set
End Property
Public ReadOnly Property Selected() As String
Get
Return m_Selected
End Get
End Property
Public Property BrowseFor() As BrowseForTypes
Get
Return m_BrowseFor
End Get
Set(ByVal Value As BrowseForTypes)
m_BrowseFor = Value
End Set
End Property
Private m_BrowseFor As BrowseForTypes = BrowseForTypes.Directories
Private m_Title As String = ""
Private m_Selected As String = ""
Public Sub New()
End Sub
End Class
확장 된 대화 상자를 구현하는 코드
Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)
Dim frmd As DirectoryDialog = New DirectoryDialog()
' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Directories
' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Computers
frmd.BrowseFor = DirectoryDialog.BrowseForTypes.FilesAndDirectories
frmd.Title = "Select a file or a folder"
If frmd.ShowDialog(Me) = DialogResult.OK Then
MsgBox(frmd.Selected)
End If
End Sub
Standard OpenFileDialog를 사용하여 폴더를 선택할 수 있습니다. 다음은 CodeProject의 기사입니다.http://www.codeproject.com/kb/dialog/openfileorfolderdialog.aspx).
끝났습니다. 당신이 사용할 수있는 FolderBrowserDialogex -내장 폴더 브라우저 디 알로그의 재사용 가능한 파생물. 이것은 경로, 심지어 UNC 경로를 입력 할 수 있습니다. 폴더 또는 파일+폴더를 찾아 볼 수 있습니다. 컴퓨터 나 프린터를 찾아 볼 수 있습니다. 내장 된 FBD를 기반으로하지만 ... 더 나은. 더 유연합니다. GUI에서 폴더를 클릭하면 경로가 텍스트 상자에 나타납니다. 경로를 키우면 폴더가 활성화됩니다. 내장 대화 상자가 부족한 많은 옵션.
전체 소스 코드. 무료. MS-Public 라이센스.
사용하는 코드 :
var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
dlg1.Description = "Select a folder to extract to:";
dlg1.ShowNewFolderButton = true;
dlg1.ShowEditBox = true;
//dlg1.NewStyle = false;
dlg1.SelectedPath = txtExtractDirectory.Text;
dlg1.ShowFullPathInEditBox = true;
dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;
// Show the FolderBrowserDialog.
DialogResult result = dlg1.ShowDialog();
if (result == DialogResult.OK)
{
txtExtractDirectory.Text = dlg1.SelectedPath;
}
afaik, .NET 프레임 워크에는 이것을 상자 밖에서 수행하는 것이 없습니다.
.NET 파일 대화 상자가 파생됩니다 commondialog:
상속 클래스는 ShowDialog를 호출하여 특정 공통 대화 상자를 만들어 Rundialog를 구현해야합니다. 상속 클래스는 HookProc을 무시하여 특정 대화 상자 후크 기능을 구현할 수 있습니다.
내장 된 모든 대화 상자는 그들의 동작, printDialog, OpenFiledialog, SaveFiledialog 등에 해당하는 쉘 API를 사용합니다.
이 기능을 수동으로 구축해야 할 것입니다.
http://www.pinvoke.net/default.aspx/shell32.shbrowseforfolder
이 샘플을 변경하면 GERAT 링크가 있습니다.
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE;
~을 위한
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE | BIF_BROWSEINCLUDEFILES;
당신은 당신이 원하는 것을 얻을 것입니다
특정 파일 유형 만 표시하려면 다음 기사 (C#의 소스 코드 포함) 도움이 될 수 있습니다.
또한 폴더 브라우저 대화 상자를 "사용자 정의"에 사용할 수있는 다른 옵션을 설명합니다.
이렇게하면 OpenFiledialog를 사용하여 폴더를 선택할 수 있습니다
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;
그만큼 ookii 대화 상자 파일이나 폴더를 입력으로 허용하고 Windows 양식 및 WPF에서 사용할 수있는 폴더 브라우저 대화 상자를 구현하십시오.
ookii.dialogs.wpf
ookii.dialogs.winforms