2009-12-12 3 views
1

Мой OpenFileDialog имеет один единственный Filter, который также является DefaultExt. Интересно, почему, когда открывается диалоговое окно, я также получаю список всех ярлыков Интернета (это нормально, например, для быстрого доступа к папкам, но не к файлам * .URL).OpenFileDialog всегда показывает * .URL (файлы ярлыков Интернета)

Есть ли какой-то волшебный переключатель, который я могу включить, чтобы он мог включить их в список, отображаемый пользователю?

В настоящее время, я должен обработать условие в обработчике FileOk событий, установив e.Cancel в true если обнаружит, что пользователь выбрал *.URL файл (не работает 100% времени, либо ссылки на некоторые, кажется, все еще будет через фильтр FileOk). Впрочем, не получить их в списке в первую очередь было бы лучше.

+0

Какой фильтр вы используете? – thrag

+0

Просто «Документ * .docx | * .docx» (например). –

ответ

2

Вы правы, что общие диалоговые окна Открыть файл Windows' показать Интернет Ярлыки вместе с папками. Я понятия не имею, почему это поведение существует, но оно есть, и это происходит в Win32 (проверьте «Блокнот»), а также приложения WinForms.

Существует способ обойти это, но предупреждение: это взломано! Если вы выберете класс диалогового окна пользовательского файла из класса FileDialog, вы получите доступ к нескольким защищенным событиям, которые вы можете использовать для настройки каждого аспекта операции FileDialog.

Dino Esposito написал статью журнала MSDN в ноябре 2003 года, в которой показано, как эта техника работает. Эта статья больше не находится на веб-сайте MSDN, но вы можете получить ее в архиве машины назад: http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx.

Возможно, вам потребуется перехватить или подклассифицировать WndProc в диалоговом окне файла, вручную просмотреть элемент управления списком файлов, идентифицировать записи, которые были ярлыками, и отправить сообщения Windows в элемент управления списком файлов, чтобы удалить эти Предметы. Затем вам нужно будет следить за обновлениями этого списка (например, из-за изменения каталога) и повторить операцию фильтрации.

Это был бы огромный взлом, но это возможно.

Если это слишком большая работа или слишком тяжелая хакерство, я бы предложил просто использовать событие FileOk, чтобы пользователи не могли выбирать ярлык, возвращая Cancel=true из вашего CancelEventHandler для события FileOk.

+0

Хорошая информация. Но ссылка на статью MSDN Margazine выглядит нарушенной. Это просто приводит людей в список проблемных страниц MSDN. –

+0

похоже, что MSDN недавно сбросила свой старый контент в журнале. Я обновил свой ответ URL-адресом для архива статей на сайте archive.org. –

2

Раздражающий. Вы можете ударить их, реализовав обработчик события FileOk, так что пользователь не может выбрать один:

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; 
} 
Смежные вопросы