OpenFileDialog всегда показывает *.URL (файлы быстрого доступа к Интернету)

StackOverflow https://stackoverflow.com/questions/1892595

Вопрос

Мой 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top