Domanda

Il mio OpenFileDialog ha una sola Filter che è anche il DefaultExt. Mi chiedo perché, quando si apre la finestra, ho anche ottenere tutti i collegamenti Internet indicati (è OK per ottenere i collegamenti alle cartelle, per esempio, ma non i file * .url).

C'è qualche interruttore magico che posso girare su al fine di farli rete incluso nella lista visualizzata per l'utente?

Al momento, devo gestire la condizione nel gestore di eventi FileOk impostando e.Cancel a true se rilevo che l'utente ha selezionato un file *.URL (non funziona al 100% del tempo o, alcune scorciatoie sembrano ancora da ottenere attraverso il filtro FileOk). Non inducendole nella lista, in primo luogo sarebbe meglio, però.

È stato utile?

Soluzione

Sei corretto che le finestre di dialogo Apri file comuni di Windows' mostrano collegamenti Internet insieme con le cartelle. Non ho idea del perché esiste questo comportamento, ma è lì- e succede in Win32 (provate il Blocco note per verificare), così come WinForms app.

C'è un modo per risolvere questo problema, ma attenzione: è hacky! Se si deriva una finestra di dialogo di classe file personalizzato dalla classe FileDialog, è possibile accedere ad alcuni eventi protette che è possibile utilizzare per personalizzare ogni aspetto del funzionamento del FileDialog.

Dino Esposito ha scritto un articolo MSDN Magazine nel novembre del 2003 che mostra come funziona questa tecnica. Questo articolo non è più sul sito MSDN, ma si può ottenere sul dell'archivio della macchina Wayback qui: http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx .

Ciò che probabilmente dovreste fare è quello di agganciare o sottoclasse WndProc della finestra di dialogo file, manualmente guardare attraverso il controllo elenco dei file, individuare le voci che erano le scorciatoie, e inviare messaggi di Windows per il controllo elenco dei file per rimuovere tali elementi . Allora avresti bisogno di guardare per gli aggiornamenti di tale elenco (per esempio da un cambiamento di directory) e ripetere l'operazione di filtraggio.

Questo sarebbe un enorme hack, ma è possibile.

Se questo è troppo lavoro o l'hackiness è troppo, suggerirei semplicemente utilizzando l'evento FileOk per impedire agli utenti di selezionare un collegamento restituendo Cancel=true dal CancelEventHandler per l'evento FileOk.

Altri suggerimenti

fastidioso. Si possono colpire mediante l'attuazione di un gestore per l'evento FileOk modo che l'utente non può mai scegliere una:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top