Pergunta

Meu OpenFileDialog tem um único Filter que é também o DefaultExt. Eu me pergunto por que, quando o diálogo é aberta, eu também obter todos os atalhos da Internet listadas (que é OK para obter os atalhos para as pastas, por exemplo, mas não os arquivos * .url).

Existe alguma chave mágica que eu posso ligar, a fim de net obtê-los incluído na lista exibida para o usuário?

Atualmente, eu tenho que lidar com a condição no manipulador de eventos FileOk definindo e.Cancel para true se eu detectar que o usuário selecionou um arquivo *.URL (ele não está funcionando 100% do tempo, quer, alguns atalhos parecem ainda estar recebendo através do filtro FileOk). Não fazê-los na lista em primeiro lugar seria melhor, no entanto.

Foi útil?

Solução

Você está correto que diálogos comuns Abrir arquivo do Windows' mostrar atalhos da Internet, juntamente com pastas. Eu não tenho idéia por que existe esse comportamento, mas é lá- e isso acontece em Win32 (experimente o bloco de notas para verificar), bem como WinForms apps.

Há uma maneira de contornar isso, mas aviso: é hacky! Se você derivar uma classe de diálogo de arquivo de costume da classe FileDialog, você tem acesso a alguns eventos protegidos que você pode usar para personalizar cada aspecto da operação do FileDialog.

Dino Esposito escreveu um artigo MSDN Magazine em novembro de 2003 que mostra como esta técnica funciona. Este artigo não é mais no site do MSDN, mas você pode obtê-lo na wayback da máquina arquivar aqui: http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx .

O que você provavelmente teria que fazer é ligar ou subclasse o WndProc da janela de ficheiros, manualmente olhar através do controle de lista de arquivos, identificar entradas que eram atalhos, e enviar mensagens do Windows para o controle de lista de arquivo para remover esses itens . Então você precisa prestar atenção para atualizações dessa lista (por exemplo, de uma mudança de diretório) e repita a operação de filtragem.

Este seria um grande corte, mas é possível.

Se isto é muito trabalho ou o hackiness é demais, eu sugiro apenas usando o evento FileOk para impedir que os usuários selecionar um atalho, devolvendo Cancel=true do seu CancelEventHandler para o evento FileOk.

Outras dicas

Annoying. Você pode bater-los, implementando um manipulador para o evento FileOk de modo que o usuário nunca pode selecionar um:

private void openFileDialog1_FileOk(object sender, CancelEventArgs e) {
  string ext = System.IO.Path.GetExtension(openFileDialog1.FileName);
  if (String.Compare(ext, ".url", true) == 0) e.Cancel = true;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top