Каков наилучший способ воспроизвести функциональность пользовательского интерфейса папки Windows Explorer в WPF? - PullRequest
0 голосов
/ 11 февраля 2010

Так что я использую FileSystemWatcher для заполнения и обновления списка воспроизведения. Я хочу воспроизвести многие функции Windows Explorer, самое главное:
* встроенное переименование
* медленный двойной щелчок, чтобы переименовать

У меня довольно много хлопот, и я подумал: может быть, есть более простой способ, чем переопределить колесо? Может быть, я могу как-то разместить окно Windows Explorer в своем приложении в качестве элемента управления?

1 Ответ

2 голосов
/ 13 февраля 2010

Размещение реального окна Windows Explorer в вашем приложении возможно, но сопряжено с опасностью: методы в XP и Vista отличаются от Win7, и вы будете иметь дело со всеми видами низкоуровневых вещей. Я настоятельно рекомендую не пытаться.

Я думаю, что ваши лучшие варианты:

  1. Используйте Microsoft.Win32.OpenFileDialog, если его можно легко адаптировать к вашим потребностям, или
  2. Код вашей собственной функциональности, или если вы очень смелый:
  3. Запустить отдельное окно проводника, опционально с кодом, который пытается принудительно установить его положение и размер над вашим приложением (это тоже сложно ...)

Примечания о функции встроенного переименования

Встроенное переименование и медленный двойной щелчок для переименования функций действительно довольно просты в реализации.

На ваш взгляд модель добавить:

  • Строка "NewName" DependencyProperty
  • "Переименование" bool DependencyProperty с PropertyChangedCallback. Когда «Переименование» станет правдой, скопируйте Имя в NewName. Когда оно становится ложным, если NewName! = Имя, переименуйте файл в Имя обновления.

В вашем DataTemplate добавьте триггер «Переименование», который заменяет ваш TextBlock, связанный с «Name», на TextBox, связанный с «NewName».

Добавьте эти обработчики событий: * Событие KeyDown: если нажата клавиша F2, происходит переименование. Если нажата Enter и переименовывается, установите Renaming = false. Если нажата Esc и переименовывается, скопируйте Name в NewName и установите Renaming = false. * Событие LostFocus: Set Renaming = false * Событие SelectionChanged для контейнера: отметка времени последнего изменения выбора. * Событие MouseDown: если щелчок левой кнопкой мыши и выбор изменились> 0,5 секунды назад, установите Renaming = true

Многие другие функции представления Explorer также легко реализуются, такие как группировка и несколько столбцов.

Надеюсь, это поможет.

...