Como você configura um OpenFileDialog para selecionar pastas?

251

No VS .NET, quando você seleciona uma pasta para um projeto, uma caixa de diálogo que se parece com um OpenFileDialog ou SaveFileDialog é exibida, mas é configurada para aceitar apenas pastas. Desde que eu vi isso, eu queria saber como é feito. Estou ciente do FolderBrowserDialog, mas nunca gostei muito dessa caixa de diálogo. Começa muito pequeno e não me permite tirar vantagem de poder digitar um caminho.

Agora estou quase certo de que não existe uma maneira de fazer isso no .NET, mas também estou curioso em saber como você faz isso a partir de código não gerenciado. Além de reimplementar completamente a caixa de diálogo do zero, como você modifica a caixa de diálogo para ter esse comportamento?

Também gostaria de reafirmar que estou ciente do FolderBrowserDialog, mas às vezes não gosto de usá-lo, além de estar realmente curioso para saber como configurar um diálogo dessa maneira. Dizer-me para usar apenas o FolderBrowserDialog me ajuda a manter uma experiência de interface do usuário consistente, mas não satisfaz minha curiosidade, portanto não conta como resposta.

Também não é algo específico do Vista; Eu tenho visto esse diálogo desde o VS .NET 2003, por isso é possível no Win2k e WinXP. Isso é menos uma pergunta "Eu quero saber a maneira correta de fazer isso" e mais uma pergunta "Eu tenho curiosidade sobre isso desde que eu queria fazer isso no VS 2003". Entendo que a caixa de diálogo de arquivos do Vista tem uma opção para fazer isso, mas ele está funcionando no XP, então eu sei que eles fizeram algo para fazê-lo funcionar. As respostas específicas do Vista não são respostas, porque o Vista não existe no contexto da pergunta.

Atualização: estou aceitando a resposta de Scott Wisniewski porque ela vem com uma amostra funcional, mas acho que Serge merece crédito por apontar para a personalização da caixa de diálogo (que é reconhecidamente desagradável do .NET, mas sim o trabalho) e Mark Ransom para descobrir que MS provavelmente rolou uma caixa de diálogo personalizada para esta tarefa.

OwenP
fonte
7
apenas uma solução simples de codeproject codeproject.com/Articles/44914/… [A chave para fazer o OpenFileDialog selecionar arquivos e pastas é definir as propriedades ValidateNames e CheckFileExists como false (dialog.ValidateNames = false; dialog.CheckFileExists = false) e defina FileName como uma palavra-chave especial para garantir que as pastas sejam selecionadas (dialog.FileName = "Folder Selection";).]]]
Riju
3
Envie isso como resposta, ele fez o trabalho para o meu projeto.
CigarDoug
@Riju dialog.FileName = "Folder Selection"deveria estar dialog.FileName = "Folder Selection."com o período à direita? de qualquer maneira, não consigo fazê-lo funcionar no PowerShell no segundo clique em "Abrir" de qualquer maneira. Ele continua dizendo arquivo não encontrado, embora CheckFileExists é supostamente falsa
ComradeJoecool
NVM, na configuração PowerShell dialog.CheckFileExists = 0em vez de falso resolvido o meu problema
ComradeJoecool
Você já experimentou o Ookii Dialogs for WPF ?
C. Augusto Proiete

Respostas:

57

Eu tenho uma caixa de diálogo que escrevi chamada OpenFileOrFolder, que permite abrir uma pasta ou um arquivo.

Se você definir seu valor AcceptFiles como false, ele funcionará apenas no modo de pasta de aceitação.

Você pode baixar a fonte do GitHub aqui

Scott Wisniewski
fonte
4
Muito interessante e definitivamente tão complicado quanto eu imaginara. Alguma chance de anotá-lo e apontar o que ele faz? Isso, juntamente com outros comentários, me leva a crer que a MS provavelmente acabou de lançar seu próprio diálogo.
OwenP 5/02/09
1
Recebo o seguinte erro ao tentar criar sua solução ... infelizmente, o c ++ não é um dos meus pontos fortes ... O erro 1 não pode abrir o arquivo de inclusão 'afxres.h'.
Ignacio Soler Garcia
1
@SoMoS e outros com o mesmo problema: no arquivo WindowsFormsApplication1.csproj, edite a linha 100 para que corresponda à sua configuração. No meu caso, tive que alterar "9.0" para "10.0" (duas vezes) e remover "(x86)" (duas vezes).
RenniePet
2
Eu baixei o código (zip) e encontrei o arquivo .h (C) e compilei com erro como não é possível abrir o arquivo de inclusão 'sal.h'.
Lei Yang
2
Esta solução também não funciona no VS2010 e no VS2017!
AleX_
49

Você pode usar o FolderBrowserDialogEx - um derivado reutilizável do FolderBrowserDialog interno. Este permite que você digite um caminho, mesmo um caminho UNC. Você também pode procurar computadores ou impressoras com ele. Funciona exatamente como o FBD embutido, mas ... melhor.

(Edição: Eu deveria ter apontado que esta caixa de diálogo pode ser configurada para selecionar arquivos ou pastas.)

Código fonte completo (um pequeno módulo C #). Livre. Licença MS-Public.

Código para usá-lo:

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;
}
Cheeso
fonte
7
Desculpe se ofendi, é frustrante fazer uma pergunta e soletrar "Quero essa coisa específica, não essas outras coisas" e pedir às pessoas que alegremente sugeram a coisa não solicitada. Eu queria uma caixa de diálogo do navegador de arquivos, não uma caixa de diálogo do navegador de pastas.
31409 OwenP
15
Do jeito que a pergunta é formulada, parece-me que está pedindo uma caixa de diálogo do seletor de pastas - não é esse o caso? Enfim, é exatamente isso que eu estava procurando +1
Tim
Definitivamente a melhor resposta até agora
Vasil Popov
1
Isso não muda o fato, que a resposta ainda é uma resposta apenas de link. Mostrar como usar o código hospedado em um recurso externo deixa de ser útil, quando esse link também fica temporariamente ou permanentemente indisponível. As regras existem por um motivo e essa contribuição está em conflito com essas regras.
11nspectable
1
Eu olhei para esta resposta e, aparentemente, não faz referência a um recurso externo. Portanto, "todas as outras respostas" estão claramente erradas. Se você sente que estou exagerando, talvez deva levantar uma questão na meta para discutir as regras. Não vou. Vou apenas aplicá-los.
11nspectable
48

Existe o pacote de códigos da API do Windows. Tem muitas coisas relacionadas ao shell, incluindo a CommonOpenFileDialogclasse (noMicrosoft.WindowsAPICodePack.Dialogs espaço para nome). Essa é a solução perfeita - a caixa de diálogo aberta usual, com apenas as pastas exibidas.

Aqui está um exemplo de como usá-lo:

CommonOpenFileDialog cofd = new CommonOpenFileDialog();
cofd.IsFolderPicker = true;
cofd.ShowDialog();

Infelizmente, a Microsoft não envia mais este pacote, mas várias pessoas enviaram binários não oficialmente para o NuGet. Um exemplo pode ser encontrado aqui . Este pacote é apenas o material específico do shell. Caso você precise, o mesmo usuário possui vários outros pacotes que oferecem mais funcionalidades presentes no pacote original.

Ken Wayne VanderLinde
fonte
1
Eu não sabia que isso está no Windows API Code Pack - obrigado por apontar isso.
Patrick Klug 29/09
10
A classe CommonOpenFileDialog existe apenas no Windows Vista ou posterior, portanto, lançará uma exceção em sistemas operacionais mais antigos
Rachel
1
Você pode dizer como fazer referência ao Windows API Code Pack?
achou
1
A Galeria de arquivos foi desativada. , ou então o link diz .. Esse poderia ser o novo local?
Padrão
3
A propósito, a classe CommonOpenFileDialog está no espaço de nome Microsoft.WindowsAPICodePack.Dialogs (demorei um pouco para encontrá-lo).
morgb
35

O pacote Ookii.Dialogs contém um wrapper gerenciado em torno da nova caixa de diálogo do navegador de pastas (estilo Vista). Ele também é degradado normalmente em sistemas operacionais mais antigos.

Christian Klauser
fonte
2
Legal, é um código aberto licenciado no estilo BSD!
Roman Starkov 30/07
7
o único problema é que não vou me deixar usar o perfil de cliente da estrutura .net como destino.
Kugel
2
Solução muito boa. Esta é, na minha opinião, a melhor resposta. Exatamente o que eu procurava há 3 anos.
Samuel
1
Outro problema com esta solução: ela não permite ao usuário colar um caminho inexistente. Menor, comparativamente, mas ainda uma pena.
Roman Starkov
1
Melhor resposta prática para quem deseja um OpenFileDialogdiálogo de pasta com estilo.
aqua
27

Melhor usar o FolderBrowserDialog para isso.

using (FolderBrowserDialog dlg = new FolderBrowserDialog())
{
    dlg.Description = "Select a folder";
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        MessageBox.Show("You selected: " + dlg.SelectedPath);
    }
}
Ryan Farley
fonte
9
Estou ciente de que é melhor usar um FolderBrowserDialog. Estou curioso para saber como foi feito, independentemente. O FolderBrowserDialog fede de várias maneiras; mesmo no Vista, ele não possui a barra de lugares. Engraçado como se é melhor o MS evitou isso em 3 versões do VS até agora.
OwenP 03/02/09
24
O FolderBrowserDialog tem muitos problemas de usabilidade. Eu não consideraria realmente colocá-lo em um aplicativo. Veja meu post para uma caixa de diálogo com uma usabilidade muito melhor
Scott Wisniewski
6
O FolderBrowserDialog não permite: - digitar / colar caminhos completos no campo de texto na parte inferior - usar a barra "Links favoritos" no Vista - usar a pesquisa no Vista
decasteljau
89
O FolderBrowserDialog é uma parte realmente horrível da interface do usuário.
mackenir
32
Sério, pessoal, POR FAVOR, pare de colocar esse diálogo irritante em seus aplicativos. Possui interface do usuário MUITO RUIM, conforme destacado pelos comentários anteriores.
Roman Starkov
23

Após horas de pesquisa, encontrei esta resposta por leetNightShade para uma solução funcional .

Acredito que há três coisas que tornam essa solução muito melhor que todas as outras.

  1. É simples de usar. Requer apenas que você inclua dois arquivos (que podem ser combinados com um de qualquer maneira) em seu projeto.
  2. Ele volta ao padrão FolderBrowserDialog quando usado em sistemas XP ou mais antigos.
  3. O autor concede permissão para usar o código para qualquer finalidade que você considerar adequada.

    Não há licença, pois você é livre para pegar e fazer com o código o que quiser.

Faça o download do código aqui .

Alex Essilfie
fonte
@ MattDavis: Confirmei que ele funciona no .NET Framework 4.0 (padrão e perfil de cliente). Apenas verifique se você adicionou o FolderSelectDialog.cs e o Reflector.cs ao seu projeto. Porém, uma coisa ... você está executando no Windows 8? Eu testei em um computador Win7.
Alex Essilfie
@ Alex Essilfie, você está correto. Eu devo ter feito algo errado ao colocá-lo no meu projeto. Excluirei meu comentário anterior para maior clareza.
Matt Davis
Percorreu várias opções e pensando que esta é a melhor. Recomendando.
Jaded
Trabalhou no windows 10 para mim. Boa solução simples
David Wilton
tem que respeitar o failover em sistemas mais antigos
Mike M
17

Cópia de áudio exata funciona dessa maneira no Windows XP. A caixa de diálogo padrão de abertura de arquivo é exibida, mas o campo nome do arquivo contém o texto "Nome do arquivo será ignorado".

Apenas adivinhando aqui, mas suspeito que a string seja injetada no controle de edição da caixa de combinação toda vez que uma alteração significativa for feita na caixa de diálogo. Enquanto o campo não estiver em branco e os sinalizadores da caixa de diálogo estiverem configurados para não verificar a existência do arquivo, a caixa de diálogo poderá ser fechada normalmente.

Edit: isso é muito mais fácil do que eu pensava. Aqui está o código em C ++ / MFC, você pode traduzi-lo para o ambiente de sua escolha.

CFileDialog dlg(true, NULL, "Filename will be ignored", OFN_HIDEREADONLY | OFN_NOVALIDATE | OFN_PATHMUSTEXIST | OFN_READONLY, NULL, this);
dlg.DoModal();

Edit 2: Esta deve ser a tradução para C #, mas eu não sou fluente em C #, então não atire em mim se não funcionar.

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.FileName = "Filename will be ignored";
openFileDialog1.CheckPathExists = true;
openFileDialog1.ShowReadOnly = false;
openFileDialog1.ReadOnlyChecked = true;
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    // openFileDialog1.FileName should contain the folder and a dummy filename
}

Edição 3: Finalmente, olhei para a caixa de diálogo real em questão, no Visual Studio 2005 (não tive acesso a ela anteriormente). Não é a caixa de diálogo padrão para abrir arquivos! Se você inspecionar as janelas no Spy ++ e compará-las com um arquivo padrão aberto, verá que os nomes de estrutura e classe não coincidem. Quando você olha atentamente, também pode identificar algumas diferenças entre o conteúdo das caixas de diálogo. Minha conclusão é que a Microsoft substituiu completamente a caixa de diálogo padrão no Visual Studio para oferecer esse recurso. Minha solução ou algo semelhante será o mais próximo possível, a menos que você esteja disposto a codificar o seu a partir do zero.

Mark Ransom
fonte
17

OK, deixe-me tentar conectar o primeiro ponto ;-) Jogar um pouco com o Spy ++ ou Winspector mostra que a caixa de texto Pasta no Local do Projeto VS é uma personalização da caixa de diálogo padrão. Não é o mesmo campo que a caixa de texto do nome do arquivo em uma caixa de diálogo de arquivo padrão, como a do Bloco de Notas.

A partir daí, eu acho que o VS oculta o nome do arquivo e as caixas de texto / caixas de combinação e usa um modelo de caixa de diálogo personalizado para adicionar sua própria parte na parte inferior da caixa de diálogo.

EDIT: Aqui está um exemplo de tal personalização e como fazê-lo (no Win32. Não no .NET):

m_ofn é a estrutura OPENFILENAME subjacente à caixa de diálogo do arquivo. Adicione estas 2 linhas:

  m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_IMPORTXLIFF);
  m_ofn.Flags |= OFN_ENABLETEMPLATE;

em que IDD_FILEDIALOG_IMPORTXLIFF é um modelo de caixa de diálogo personalizado que será adicionado na parte inferior da caixa de diálogo. Veja a peça em vermelho abaixo. (fonte: apptranslator.com )texto alternativo

Nesse caso, a peça personalizada é apenas um rótulo + um hiperlink, mas pode ser qualquer caixa de diálogo. Ele poderia conter um botão OK que permitiria validar somente a seleção de pastas.

Mas como nos livraríamos de alguns dos controles na parte padrão da caixa de diálogo, eu não sei.

Mais detalhes neste artigo do MSDN .

Serge Wautier
fonte
1
Isso soa como algumas explicações que ouvi no passado, mas nunca vi uma demonstração do conceito. Existem orientações na documentação do MSDN sobre como fazer isso?
OwenP 03/02/09
10

Você pode subclassificar a caixa de diálogo do arquivo e obter acesso a todos os seus controles. Cada um possui um identificador que pode ser usado para obter seu identificador de janela. Você pode então mostrá-los e ocultá-los, receber mensagens sobre mudanças na seleção, etc. etc. Tudo depende de quanto esforço você deseja fazer.

Fizemos o nosso usando o suporte à classe WTL e personalizamos a caixa de diálogo de arquivo para incluir uma barra de locais personalizada e visualizações COM de plug-in.

O MSDN fornece informações sobre como fazer isso usando o Win32, este artigo do CodeProject inclui um exemplo e este artigo do CodeProject fornece um exemplo do .NET .

Jeff Yates
fonte
10

Você pode usar código como este

  • O filtro é ocultar arquivos
  • O nome do arquivo é ocultar o primeiro texto

Para ocultar avançado da caixa de texto do nome do arquivo, é necessário olhar para OpenFileDialogEx

O código:

{
    openFileDialog2.FileName = "\r";
    openFileDialog1.Filter = "folders|*.neverseenthisfile";
    openFileDialog1.CheckFileExists = false;
    openFileDialog1.CheckPathExists = false;
}
Avram
fonte
Simples e é o que eu preciso para o Windows 7 +
Hao Nguyen
OFN_NOVALIDATE também é necessário em sinalizadores
Goblin Alchemist
5

Presumo que você esteja no Vista usando o VS2008? Nesse caso, acho que a opção FOS_PICKFOLDERS está sendo usada ao chamar a caixa de diálogo do arquivo do Vista IFileDialog . Receio que, no código .NET, isso envolva bastante código de interoperabilidade P / Invoke para funcionar.

Duncan Smart
fonte
1
Específico para o Vista; Vi isso pela primeira vez no VS 2003 no Windows XP.
OwenP 03/02/09
2

Primeira solução

Eu desenvolvi isso como uma versão limpa da caixa de diálogo de seleção de pastas no estilo .NET Win 7 de Bill Seddon, do lyquidity.com (não tenho afiliação). (Aprendi sobre o código dele com outra resposta nesta página ). Eu escrevi o meu próprio porque a solução dele requer uma classe Reflection adicional que não é necessária para esse objetivo focado, usa controle de fluxo baseado em exceção, não armazena em cache os resultados de suas chamadas de reflexão. Observe que a VistaDialogclasse estática aninhada é para que suas variáveis ​​de reflexão estática não tentem ser preenchidas se o Showmétodo nunca for chamado. Ele volta à caixa de diálogo anterior ao Vista, se não estiver em uma versão do Windows suficientemente alta. Deve funcionar no Windows 7, 8, 9, 10 e superior (teoricamente).

using System;
using System.Reflection;
using System.Windows.Forms;

namespace ErikE.Shuriken {
    /// <summary>
    /// Present the Windows Vista-style open file dialog to select a folder. Fall back for older Windows Versions
    /// </summary>
    public class FolderSelectDialog {
        private string _initialDirectory;
        private string _title;
        private string _fileName = "";

        public string InitialDirectory {
            get { return string.IsNullOrEmpty(_initialDirectory) ? Environment.CurrentDirectory : _initialDirectory; }
            set { _initialDirectory = value; }
        }
        public string Title {
            get { return _title ?? "Select a folder"; }
            set { _title = value; }
        }
        public string FileName { get { return _fileName; } }

        public bool Show() { return Show(IntPtr.Zero); }

        /// <param name="hWndOwner">Handle of the control or window to be the parent of the file dialog</param>
        /// <returns>true if the user clicks OK</returns>
        public bool Show(IntPtr hWndOwner) {
            var result = Environment.OSVersion.Version.Major >= 6
                ? VistaDialog.Show(hWndOwner, InitialDirectory, Title)
                : ShowXpDialog(hWndOwner, InitialDirectory, Title);
            _fileName = result.FileName;
            return result.Result;
        }

        private struct ShowDialogResult {
            public bool Result { get; set; }
            public string FileName { get; set; }
        }

        private static ShowDialogResult ShowXpDialog(IntPtr ownerHandle, string initialDirectory, string title) {
            var folderBrowserDialog = new FolderBrowserDialog {
                Description = title,
                SelectedPath = initialDirectory,
                ShowNewFolderButton = false
            };
            var dialogResult = new ShowDialogResult();
            if (folderBrowserDialog.ShowDialog(new WindowWrapper(ownerHandle)) == DialogResult.OK) {
                dialogResult.Result = true;
                dialogResult.FileName = folderBrowserDialog.SelectedPath;
            }
            return dialogResult;
        }

        private static class VistaDialog {
            private const string c_foldersFilter = "Folders|\n";

            private const BindingFlags c_flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            private readonly static Assembly s_windowsFormsAssembly = typeof(FileDialog).Assembly;
            private readonly static Type s_iFileDialogType = s_windowsFormsAssembly.GetType("System.Windows.Forms.FileDialogNative+IFileDialog");
            private readonly static MethodInfo s_createVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("CreateVistaDialog", c_flags);
            private readonly static MethodInfo s_onBeforeVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("OnBeforeVistaDialog", c_flags);
            private readonly static MethodInfo s_getOptionsMethodInfo = typeof(FileDialog).GetMethod("GetOptions", c_flags);
            private readonly static MethodInfo s_setOptionsMethodInfo = s_iFileDialogType.GetMethod("SetOptions", c_flags);
            private readonly static uint s_fosPickFoldersBitFlag = (uint) s_windowsFormsAssembly
                .GetType("System.Windows.Forms.FileDialogNative+FOS")
                .GetField("FOS_PICKFOLDERS")
                .GetValue(null);
            private readonly static ConstructorInfo s_vistaDialogEventsConstructorInfo = s_windowsFormsAssembly
                .GetType("System.Windows.Forms.FileDialog+VistaDialogEvents")
                .GetConstructor(c_flags, null, new[] { typeof(FileDialog) }, null);
            private readonly static MethodInfo s_adviseMethodInfo = s_iFileDialogType.GetMethod("Advise");
            private readonly static MethodInfo s_unAdviseMethodInfo = s_iFileDialogType.GetMethod("Unadvise");
            private readonly static MethodInfo s_showMethodInfo = s_iFileDialogType.GetMethod("Show");

            public static ShowDialogResult Show(IntPtr ownerHandle, string initialDirectory, string title) {
                var openFileDialog = new OpenFileDialog {
                    AddExtension = false,
                    CheckFileExists = false,
                    DereferenceLinks = true,
                    Filter = c_foldersFilter,
                    InitialDirectory = initialDirectory,
                    Multiselect = false,
                    Title = title
                };

                var iFileDialog = s_createVistaDialogMethodInfo.Invoke(openFileDialog, new object[] { });
                s_onBeforeVistaDialogMethodInfo.Invoke(openFileDialog, new[] { iFileDialog });
                s_setOptionsMethodInfo.Invoke(iFileDialog, new object[] { (uint) s_getOptionsMethodInfo.Invoke(openFileDialog, new object[] { }) | s_fosPickFoldersBitFlag });
                var adviseParametersWithOutputConnectionToken = new[] { s_vistaDialogEventsConstructorInfo.Invoke(new object[] { openFileDialog }), 0U };
                s_adviseMethodInfo.Invoke(iFileDialog, adviseParametersWithOutputConnectionToken);

                try {
                    int retVal = (int) s_showMethodInfo.Invoke(iFileDialog, new object[] { ownerHandle });
                    return new ShowDialogResult {
                        Result = retVal == 0,
                        FileName = openFileDialog.FileName
                    };
                }
                finally {
                    s_unAdviseMethodInfo.Invoke(iFileDialog, new[] { adviseParametersWithOutputConnectionToken[1] });
                }
            }
        }

        // Wrap an IWin32Window around an IntPtr
        private class WindowWrapper : IWin32Window {
            private readonly IntPtr _handle;
            public WindowWrapper(IntPtr handle) { _handle = handle; }
            public IntPtr Handle { get { return _handle; } }
        }
    }
}

É usado assim em um formulário do Windows:

var dialog = new FolderSelectDialog {
    InitialDirectory = musicFolderTextBox.Text,
    Title = "Select a folder to import music from"
};
if (dialog.Show(Handle)) {
    musicFolderTextBox.Text = dialog.FileName;
}

É claro que você pode brincar com suas opções e quais propriedades ele expõe. Por exemplo, ele permite a seleção múltipla na caixa de diálogo estilo Vista.

Segunda solução

Simon Mourier deu uma resposta que mostra como fazer exatamente o mesmo trabalho usando a interoperabilidade diretamente com a API do Windows, embora sua versão precise ser complementada para usar a caixa de diálogo de estilo mais antiga se estiver em uma versão mais antiga do Windows. Infelizmente, ainda não encontrei o post dele quando desenvolvi minha solução. Nomeie seu veneno!

ErikE
fonte
Exemplo de uso semelhante para chamar esta caixa de diálogo fina como uma caixa de diálogo (por exemplo, de aplicativos do tipo console) com alça vazia: compila imediatamente a caixa: var dialog = new FolderSelectDialog {InitialDirectory = "C: \\", Title = "Selecione um pasta para importar músicas de "}; if (dialog.Show ()) {string myFolder = dialog.FileName; }
Philm 11/06/16
Nota: Meu exemplo de uso como um comentário é difícil de ler, portanto: O mais importante mudança para o uso original "exemplo": Use uma vírgula entre InitialDirectory e Título ..
Philm
1

Experimente este da Codeproject (crédito para Nitron):

Eu acho que é a mesma caixa de diálogo que você está falando - talvez ajude se você adicionar uma captura de tela?

bool GetFolder(std::string& folderpath, const char* szCaption=NULL, HWND hOwner=NULL)
{
    bool retVal = false;

    // The BROWSEINFO struct tells the shell how it should display the dialog.
    BROWSEINFO bi;
    memset(&bi, 0, sizeof(bi));

    bi.ulFlags   = BIF_USENEWUI;
    bi.hwndOwner = hOwner;
    bi.lpszTitle = szCaption;

    // must call this if using BIF_USENEWUI
    ::OleInitialize(NULL);

    // Show the dialog and get the itemIDList for the selected folder.
    LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);

    if(pIDL != NULL)
    {
        // Create a buffer to store the path, then get the path.
        char buffer[_MAX_PATH] = {'\0'};
        if(::SHGetPathFromIDList(pIDL, buffer) != 0)
        {
            // Set the string value.
            folderpath = buffer;
            retVal = true;
        }       

        // free the item id list
        CoTaskMemFree(pIDL);
    }

    ::OleUninitialize();

    return retVal;
}
demoncodemonkey
fonte
images.google.com/… Pesquise quando estiver incerto. Descrevi o que queria e o FolderBrowserDialog já foi desqualificado como resposta.
OwenP 03/02/09
"Estou ciente do FolderBrowserDialog, mas nunca gostei muito desse diálogo. Ele começa muito pequeno e não me permite tirar proveito de poder digitar um caminho." Faça alguma pesquisa você mesmo - você pode digitar um caminho lá. Enfim, acho que é uma pergunta um tanto ambígua, que boa sorte.
Demoncodemonkey 03/02/09
@demoncodemonkey: você não pode digitar uma parte do caminho e depois navegar para o destino desejado. De longe, não é tão conveniente quanto as opções que o FileOpenDialog oferece.
303 Treb
1

No Vista, você pode usar o IFileDialog com o conjunto de opções FOS_PICKFOLDERS. Isso fará com que a janela do OpenFileDialog seja exibida, onde você pode selecionar pastas:

var frm = (IFileDialog)(new FileOpenDialogRCW());
uint options;
frm.GetOptions(out options);
options |= FOS_PICKFOLDERS;
frm.SetOptions(options);

if (frm.Show(owner.Handle) == S_OK) {
    IShellItem shellItem;
    frm.GetResult(out shellItem);
    IntPtr pszString;
    shellItem.GetDisplayName(SIGDN_FILESYSPATH, out pszString);
    this.Folder = Marshal.PtrToStringAuto(pszString);
}

Para Windows mais antigo, você sempre pode recorrer a truques ao selecionar qualquer arquivo na pasta.

Exemplo de trabalho que funciona no .NET Framework 2.0 e posterior pode ser encontrado aqui .

Josip Medved
fonte
1

Você pode usar código como este

O filtro é uma sequência vazia. O nome do arquivo é AnyName, mas não está em branco

        openFileDialog.FileName = "AnyFile";
        openFileDialog.Filter = string.Empty;
        openFileDialog.CheckFileExists = false;
        openFileDialog.CheckPathExists = false;
Lantran
fonte
6
Sei que este é um post antigo, mas, para quem quiser experimentar, ele não funciona, a menos que o diretório que você deseja abrir não possua nenhum diretório filho. Portanto, se eu quiser permitir que meu usuário navegue até uma pasta, selecione-a e preencha o caminho da pasta em alguma caixa de texto, o usuário nunca poderá selecionar C: \ SomeParentDir se o diretório C: \ SomeParentDir \ SomeChildDir existir, porque selecionar "Abrir "apenas leva você ao diretório filho.
21712 Jim
Boa tentativa .. mas isso resulta em uma interface do usuário terrível, como "AnyFile" na caixa de texto, apenas aguardando que o usuário substitua seu texto. mas boa tentativa ..
GY
-1

Eu sei que a pergunta estava na configuração de, OpenFileDialogmas, como o Google me trouxe aqui, posso também salientar que, se você estiver procurando SOMENTE por pastas, deverá usar um FolderBrowserDialogEm vez disso, conforme respondido por outra pergunta SO abaixo.

Como especificar o caminho usando o diálogo de arquivo aberto no vb.net?

AltF4_
fonte
Enganador. 1) É não a única escolha; 2) Não é uma boa escolha na maioria dos casos; Ainda assim, requer o mínimo de código, negociado por mais tempo gasto pelo usuário final.
Meow Cat 2012