Para aqueles que não desejam criar uma caixa de diálogo personalizada, mas ainda preferem uma maneira 100% WPF e não desejam usar DDLs separadas, dependências adicionais ou APIs desatualizadas, criei um hack muito simples usando a caixa de diálogo Salvar como.
Nenhuma diretiva de uso é necessária, você pode simplesmente copiar e colar o código abaixo!
Ainda deve ser muito fácil de usar e a maioria das pessoas nunca notará.
A idéia vem do fato de podermos alterar o título dessa caixa de diálogo, ocultar arquivos e contornar o nome do arquivo resultante com bastante facilidade.
É um grande truque, com certeza, mas talvez faça o trabalho muito bem para o seu uso ...
Neste exemplo, tenho um objeto de caixa de texto para conter o caminho resultante, mas você pode remover as linhas relacionadas e usar um valor de retorno, se desejar ...
// Create a "Save As" dialog for selecting a directory (HACK)
var dialog = new Microsoft.Win32.SaveFileDialog();
dialog.InitialDirectory = textbox.Text; // Use current value for initial dir
dialog.Title = "Select a Directory"; // instead of default "Save As"
dialog.Filter = "Directory|*.this.directory"; // Prevents displaying files
dialog.FileName = "select"; // Filename will then be "select.this.directory"
if (dialog.ShowDialog() == true) {
string path = dialog.FileName;
// Remove fake filename from resulting path
path = path.Replace("\\select.this.directory", "");
path = path.Replace(".this.directory", "");
// If user has changed the filename, create the new directory
if (!System.IO.Directory.Exists(path)) {
System.IO.Directory.CreateDirectory(path);
}
// Our final value is in path
textbox.Text = path;
}
Os únicos problemas com esse hack são:
- O botão Reconhecer ainda diz "Salvar" em vez de algo como "Selecionar diretório", mas em um caso como minas eu "Salvar" a seleção de diretório para que ainda funcione ...
- O campo de entrada ainda diz "Nome do arquivo" em vez de "Nome do diretório", mas podemos dizer que um diretório é um tipo de arquivo ...
- Ainda existe um menu suspenso "Salvar como tipo", mas seu valor diz "Diretório (* .este.diretório)", e o usuário não pode alterá-lo para outra coisa, funciona para mim ...
A maioria das pessoas não notará isso, embora eu definitivamente prefira usar uma maneira oficial do WPF se a Microsoft tirar a cabeça da cabeça, mas até isso acontecer, essa é a minha solução temporária.