OpenFileDialog всегда показывает *.URL (файлы быстрого доступа к Интернету)
-
19-09-2019 - |
Вопрос
Мой OpenFileDialog
имеет один единственный Filter
который также является DefaultExt
.Интересно, почему при открытии диалогового окна я также получаю список всех интернет-ярлыков (например, можно получить ярлыки для папок, но не для файлов *.URL).
Есть ли какой-нибудь волшебный переключатель, который я могу включить, чтобы в сети включить их в список, отображаемый пользователю?
В настоящее время я должен обработать условие в FileOk
обработчик событий, установив e.Cancel
Для true
если я обнаружу, что пользователь выбрал *.URL
файл (он также не работает в 100% случаев, некоторые ярлыки, похоже, все еще проходят через FileOk
фильтр).Однако было бы лучше не включать их в список с самого начала.
Решение
Вы правы в том, что в общих диалоговых окнах Windows "Открыть файл" отображаются ярлыки Интернета вместе с папками.Я понятия не имею, почему существует такое поведение, но оно есть - и это происходит в Win32 (попробуйте проверить Notepad), а также в приложениях WinForms.
Есть способ обойти это, но предупреждение:это халтурно!Если вы производите пользовательский класс файлового диалога от класса FileDialog, вы получаете доступ к нескольким защищенным событиям, которые вы можете использовать для настройки каждого аспекта работы FileDialog.
В ноябре 2003 года Дино Эспозито написал статью для журнала MSDN, в которой показано, как работает этот метод.Этой статьи больше нет на сайте MSDN, но вы можете получить ее в архиве wayback machine здесь: http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx.
Что вам, вероятно, пришлось бы сделать, так это подключить или подклассировать WndProc диалогового окна file, вручную просмотреть элемент управления file list, определить записи, которые были ярлыками, и отправить сообщения Windows элементу управления File list, чтобы удалить эти элементы.Затем вам нужно будет следить за обновлениями этого списка (напримериз изменения каталога) и повторите операцию фильтрации.
Это был бы огромный взлом, но это возможно.
Если это слишком много работы или халтурности слишком много, я бы предложил просто использовать событие FileOk, чтобы запретить пользователям выбирать ярлык, возвращая Cancel=true
из вашего CancelEventHandler для события FileOk.
Другие советы
Раздражает.Вы можете устранить их, внедрив обработчик для события 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;
}