문제

VS .NET에서 프로젝트의 폴더를 선택할 때 OpenFileDialog 또는 SaveFileDialog와 같은 대화 상자가 표시되지만 폴더 만 허용하도록 설정되어 있습니다. 나는 이것을 본 이후로 그것이 어떻게 이루어 졌는지 알고 싶었습니다. FolderBrowserDialog에 대해 알고 있지만 그 대화 상자가 정말 마음에 들지 않았습니다. 너무 작게 시작하여 경로를 입력 할 수있는 이점을 얻지 못합니다.

지금까지는 .NET에서이 작업을 수행 할 방법이 없다고 거의 확신하지만 관리되지 않는 코드에서도 어떻게 수행하는지 궁금합니다. 대화 상자를 처음부터 완전히 다시 구현하지 않는 한 대화 상자를 어떻게 수정하여이 동작을하게 하시겠습니까?

또한 FolderBrowserDialog에 대해 알고 있지만 때때로이 방식으로 대화 상자를 구성하는 방법을 궁금해하는 것 외에도 사용하고 싶지 않다는 점을 다시 말씀 드리고 싶습니다. FolderBrowserDialog 만 사용하라고하면 일관된 UI 환경을 유지하는 데 도움이되지만 호기심을 충족시키지 못하므로 답으로 간주되지 않습니다.

비스타에만 국한된 것도 아닙니다. VS .NET 2003 이후로이 대화 상자를보고 있었으므로 Win2k 및 WinXP에서 수행 할 수 있습니다. 이것은 "이 작업을 수행하는 적절한 방법을 알고 싶습니다."라는 질문이 아니라 "VS 2003에서 처음 작업하고 싶었을 때부터 궁금해했습니다."라는 질문에 가깝습니다. Vista의 파일 대화 상자에이 작업을 수행 할 수있는 옵션이 있다는 것을 알고 있지만 XP에서 작동하고 있으므로 작동하도록 무언가 한 것으로 알고 있습니다. Vista가 질문 컨텍스트에 존재하지 않기 때문에 Vista 전용 답변은 답변이 아닙니다.

업데이트 : 작업 샘플과 함께 제공되기 때문에 Scott Wisniewski의 답변을 수락하고 있지만 Serge는 대화 사용자 정의 (.NET에서 불쾌한 일이지만 그렇습니다. / em> work) 및 Mark Ransom은 MS가이 작업에 대한 사용자 지정 대화 상자를 롤링했을 가능성이 있음을 알아 냈습니다.

도움이 되었습니까?

해결책

폴더 나 파일을 열 수있는 OpenFileOrFolder 대화 상자라는 대화 상자가 있습니다.

AcceptFiles 값을 false로 설정하면 수락 폴더 모드에서만 작동합니다.

여기에서 GitHub에서 소스를 다운로드 할 수 있습니다.

다른 팁

Windows API 코드 팩이 있습니다.CommonOpenFileDialog 클래스 (Microsoft.WindowsAPICodePack.Dialogs 네임 스페이스에 있음)를 포함하여 많은 셸 관련 항목이 있습니다.이것은 완벽한 솔루션입니다. 폴더 만 표시되는 일반적인 열린 대화 상자입니다.

다음은 사용 방법의 예입니다. 라코 디스 <시간>

안타깝게도 Microsoft는 더 이상이 패키지를 제공하지 않지만 여러 사람이 비공식적으로 NuGet에 바이너리를 업로드했습니다.한 가지 예는 여기 에서 찾을 수 있습니다.이 패키지는 셸 전용입니다.필요한 경우 동일한 사용자가 원래 패키지에 더 많은 기능을 제공하는 여러 다른 패키지를 가지고 있습니다.

FolderBrowserDialogEx 를 사용할 수 있습니다.- 내장 FolderBrowserDialog의 재사용 가능한 파생물.이것은 경로, 심지어 UNC 경로를 입력 할 수있게합니다.컴퓨터 나 프린터를 검색 할 수도 있습니다.내장 FBD처럼 작동하지만 더 좋습니다.

(편집 :이 대화 상자가 파일 또는 폴더를 선택하도록 설정할 수 있음을 지적 했어야했습니다.)

전체 소스 코드 (짧은 C # 모듈 1 개).비어 있는.MS- 공개 라이선스.

사용 코드 : 라코 디스

Ookii.Dialogs 패키지에는 새로운 (Vista 스타일) 폴더 브라우저 대화 상자.또한 이전 운영 체제에서 정상적으로 저하됩니다.

FolderBrowserDialog를 사용하는 것이 좋습니다. 라코 디스

몇 시간 동안 검색 한 후 이 답변 을 찾았습니다. / 353094 / leetnightshade "> leetNightShade 에서 작동하는 솔루션 .

이 솔루션을 다른 모든 솔루션보다 훨씬 좋게 만드는 세 가지가 있습니다.

  1. 사용이 간편합니다. 프로젝트에 두 개의 파일 (어쨌든 하나로 결합 될 수 있음) 만 포함하면됩니다.
  2. 표준 FolderBrowserDialog
  3. 작성자는 귀하가 적합하다고 생각하는 목적으로 코드를 사용할 수있는 권한을 부여합니다. <인용구>

    귀하가 원하는대로 코드를 사용하여 수행 할 수있는 라이선스는 없습니다.

    여기 .

정확한 오디오 복사 는 Windows XP에서 이러한 방식으로 작동합니다. 표준 파일 열기 대화 상자가 표시되지만 파일 이름 필드에는 "파일 이름이 무시됩니다"라는 텍스트가 포함됩니다.

여기에서 추측 만했지만 대화 상자가 크게 변경 될 때마다 콤보 상자 편집 컨트롤에 문자열이 삽입되는 것 같습니다. 필드가 비어 있지 않고 파일의 존재를 확인하지 않도록 대화 상자 플래그가 설정되어있는 한 대화 상자를 정상적으로 닫을 수 있습니다.

수정 : 생각보다 훨씬 쉽습니다. 다음은 C ++ / MFC 코드입니다. 원하는 환경으로 변환 할 수 있습니다. 라코 디스

편집 2 : 이것은 C #에 대한 번역이어야하지만 저는 C #에 능통하지 않으므로 작동하지 않으면 저를 쏘지 마십시오. 라코 디스

편집 3 : 마지막으로 Visual Studio 2005에서 문제의 실제 대화 상자를 살펴 보았습니다 (이전에 액세스 할 수 없었습니다). 표준 파일 열기 대화 상자가 아닙니다! Spy ++에서 창을 검사하고 열린 표준 파일과 비교하면 구조와 클래스 이름이 일치하지 않는 것을 알 수 있습니다. 자세히 살펴보면 대화 상자의 내용 사이에 몇 가지 차이점을 발견 할 수도 있습니다. 내 결론은 Microsoft가 Visual Studio의 표준 대화 상자를 완전히 대체하여이 기능을 제공한다는 것입니다. 처음부터 직접 코딩하지 않는 한 내 솔루션이나 이와 유사한 솔루션은 최대한 가깝습니다.

좋아, 첫 번째 점을 연결 해보자 ;-) Spy ++ 또는 Winspector로 약간 재생하면 VS 프로젝트 위치의 폴더 텍스트 상자가 표준 대화 상자의 사용자 지정임을 알 수 있습니다. 메모장에있는 것과 같은 표준 파일 대화 상자의 파일 이름 텍스트 상자와 같은 필드가 아닙니다.

그때부터 VS는 파일 이름과 파일 형식 텍스트 상자 / 콤보 상자를 숨기고 사용자 지정 대화 상자 템플릿을 사용하여 대화 상자 하단에 자체 부분을 추가합니다.

편집 : 다음은 이러한 사용자 지정의 예와이를 수행하는 방법입니다 (.NET이 아닌 Win32.) :

m_ofn은 파일 대화 상자의 기초가되는 OPENFILENAME 구조체입니다. 다음 두 줄을 추가하세요. 라코 디스

여기서 IDD_FILEDIALOG_IMPORTXLIFF는 대화 상자 하단에 추가 될 사용자 정의 대화 상자 템플릿입니다. 아래 빨간색 부분을 참조하십시오. alt text
(출처 : apptranslator.com )

이 경우 사용자 정의 된 부분은 레이블 + 하이퍼 링크 뿐이지 만 모든 대화 상자가 될 수 있습니다. 폴더 만 선택을 확인하는 확인 버튼을 포함 할 수 있습니다.

하지만 대화의 표준 부분에있는 일부 컨트롤을 어떻게 제거할지 모르겠습니다.

자세한 내용은 이 MSDN 문서 .

파일 대화 상자의 하위 클래스를 만들고 모든 컨트롤에 액세스 할 수 있습니다.각각에는 창 핸들을 가져 오는 데 사용할 수있는 식별자가 있습니다.그런 다음 표시하거나 숨길 수 있으며 선택 변경 등에 대한 메시지를받을 수 있습니다. 모두 얼마나 많은 노력을 기울이 느냐에 따라 다릅니다.

WTL 클래스 지원을 사용하여 작업을 수행하고 사용자 지정 장소 표시 줄 및 플러그인 COM보기를 포함하도록 파일 대화 상자를 사용자 지정했습니다.

MSDN 은 수행 방법에 대한 정보를 제공합니다.Win32, 이 CodeProject 기사에는 예제가 포함되어 있습니다 이 CodeProject 기사는 .NET 예제를 제공합니다 .

다음과 같은 코드를 사용할 수 있습니다.

  • 필터는 파일 숨기기입니다.
  • 파일 이름은 첫 번째 텍스트 숨기기입니다.

    파일 이름에 대한 텍스트 상자의 고급 숨기기를 보려면 OpenFileDialogEx

    코드 :
    라코 디스

VS2008을 사용하는 Vista를 사용하고 있다고 가정합니까?이 경우 전화 할 때 FOS_PICKFOLDERS 옵션 이 사용되고 있다고 생각합니다.Vista 파일 대화 상자 IFileDialog ..NET 코드에서 이것은 작동하기 위해 많은 양의 P / Invoke interop 코드를 포함하게 될 것입니다.

첫 번째 솔루션

.NET Win 7 스타일 폴더 선택 대화 상자의 정리 된 버전으로 개발했습니다. by Bill Seddon ( lyquidity.com ) (제휴 관계 없음) (이 페이지의 또 다른 답변 에서 그의 코드를 배웠습니다.) 그의 솔루션에는이 집중된 목적에 필요하지 않은 추가 Reflection 클래스가 필요하고 예외 기반 흐름 제어를 사용하며 리플렉션 호출의 결과를 캐시하지 않기 때문에 직접 작성했습니다. 중첩 된 정적 VistaDialog 클래스는 Show 메서드가 호출되지 않으면 정적 반사 변수가 채워지지 않도록합니다. Windows 버전이 충분하지 않으면 Vista 이전 대화 상자로 돌아갑니다. Windows 7, 8, 9, 10 이상 (이론상)에서 작동합니다. 라코 디스

Windows Form에서 다음과 같이 사용됩니다. 라코 디스

물론 옵션과 노출되는 속성을 가지고 놀 수 있습니다. 예를 들어 Vista 스타일 대화 상자에서 다중 선택이 가능합니다.

두 번째 솔루션

Simon Mourier가 Windows API에 대해 직접 interop을 사용하여 정확히 동일한 작업을 수행하는 방법을 보여주는 답변을 제공했습니다 . 이전 버전의 Windows에서 이전 스타일 대화 상자를 사용하려면 그의 버전을 보완해야합니다. 안타깝게도 해결책을 모색했을 때 아직 그의 게시물을 찾지 못했습니다. 독의 이름을 지정하세요!

Codeproject (Nitron 크레딧)에서 다음을 시도해보세요.

당신이 말하는 것과 같은 대화라고 생각합니다. 스크린 샷을 추가하면 도움이 될까요? 라코 디스

Vista에서는 IFileDialog .그러면 폴더를 선택할 수있는 OpenFileDialog와 같은 창이 표시됩니다. 라코 디스

구형 Windows의 경우 항상 폴더에있는 파일을 선택하여 속일 수 있습니다.

.NET Framework 2.0 이상에서 작동하는 작업 예제는 여기 에서 찾을 수 있습니다..

다음과 같은 코드를 사용할 수 있습니다.

필터는 빈 문자열입니다. 파일 이름은 AnyName이지만 공백은 아닙니다. 라코 디스

WPF 용 Ookii 대화 상자 라이브러리에는WPF 용 폴더 브라우저 대화 상자의 구현을 제공하는 클래스 <인용구>

https://github.com/caioproiete/ookii-dialogs-wpf

여기에 이미지 설명 입력

Windows Forms 에서 작동하는 버전도 있습니다.

질문이 OpenFileDialog의 구성에 관한 것이었지만 Google이 저를 여기로 가져온 것을 보았을 때 폴더 만 찾는 경우 아래의 다른 SO 질문에 답한대로 대신 FolderBrowserDialog를 사용해야한다는 점을 지적 할 수 있습니다.

열린 파일을 사용하여 경로를 지정하는 방법vb.net의 대화 상자?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top