Оставить вне контроля - PullRequest
       9

Оставить вне контроля

3 голосов
/ 05 января 2010

Я улучшаю стандартный WPF TabControl. Я хочу добавить в него функцию расстыковки: пользователь перетаскивает страницу за пределами TabControl, и эта страница отсоединяется в окне. Я хочу два события в этом элементе управления - PageDragStart (возникает, когда страница перетаскивается наружу) и PageDragEnd (возникает, когда страница выпадает снаружи)

У меня нет проблем с первым событием.

Но второе ... OnDrop не вызывает, потому что элемент выпал из контейнера tabcontol. Как я могу знать, что это было уронено?

P.S. Мне нужен универсальный элемент управления (поэтому не нужно подключать функцию расстыковки и жестко закодировать ее в окне tabcontrol или что-то в этом роде)

Ответы [ 2 ]

1 голос
/ 01 марта 2010

Зачем вообще использовать DoDragDrop? Когда я читал ваше описание, использование Mouse.Capture само по себе казалось очевидным решением:

  1. Обработка OnMouseLeftButtonDown на вкладке и начало захвата
  2. Обработка OnMouseMove на вкладке и обновление курсора на основе проверки нажатия
  3. Обработка OnMouseLeftButtonUp на вкладке, остановка захвата и внесение соответствующих изменений

Причины, по которым вы можете использовать DoDragDrop вместо простого захвата мыши:

  1. Интеграция с Windows OLE drag and drop, чтобы вы могли перетаскивать между приложениями и технологиями
  2. Модальная природа вызова DoDragDrop (что на самом деле кажется мне более невыгодным)
  3. Автоматическое тестирование попадания целей
  4. Стандартизированный API-интерфейс «операция удаления», позволяющий несвязанным приложениям обрабатывать операции копирования и перемещения и т. Д.

Очевидно, вам не нужна интеграция OLE или поддержка нескольких приложений, и вы хотите настроить тестирование попаданий, поэтому кажется, что DoDragDrop не имеет никаких преимуществ по сравнению с прямой обработкой захвата мыши.

0 голосов
/ 05 января 2010

Я решил проблему - довольно брутально и небезопасно. Но это сработает как временное решение.

Хорошо, когда я поднимаю событие PageDragStart, я вызываю Mouse.Capture (this, CaptureMode.SubTree); Когда страница куда-то сбрасывается - DoDragDrop генерирует разные исключения (COMException, NullReference (я не смог найти, какой объект является нулевым) и некоторые другие, которые я не помню) Я ловлю исключение и вызываю событие PageDragEnd (если для свойства IsPageDraggingOut установлено значение true).

Насколько вы можете видеть, это решение действительно грязное и плохое. Но это работает.

Итак, есть ли другие идеи (или идеи, как правильно работать с Mouse.Capture)?

...