Winforms Control Drag / Drop регистрация через InterOp - PullRequest
1 голос
/ 12 декабря 2011

довольно длинный, я боюсь, но, пожалуйста, потерпите меня ...

У меня есть проект VSTO, который позволяет перетаскивать элементы Outlook (письма, вложения и т. Д.) На элемент управления winforms - в частности,TreeView (размещенный в CustomTaskPane внутри Outlook), который обеспечивает обычную обратную связь пользовательского интерфейса, выделяя папки, через которые происходит перетаскивание.Я установил для свойства TreeView AllowDrop значение true, и все нужные мне события запускаются, и все работает отлично.

Однако у меня есть ситуация в более старых версиях Outlook (до 2010 г.), где объектная модель отображаетсяVSTO старше, и у меня нет доступа к свойствам, которые позволяют мне захватывать то, что перетаскивается через Outlook iself через управляемый код.

Я обошел эту проблему, подключившись непосредственно к собственному перетаскиванию Windows /понижаться.Код, позволяющий сделать это, довольно обширный и требует много взаимодействия, но суть в том, что мне нужно зарегистрировать элемент управления через -

[DllImport("OLE32.DLL", ExactSpelling = true, CharSet = CharSet.Auto, PreserveSig = false)]
    public static extern void RegisterDragDrop(HandleRef hwnd, IOleDropTarget target);

Я расширяю класс TreeView и реализую IOleDropTarget, чтобы разрешить мой новый элемент управления.класс для регистрации с помощью этого метода.Опять же, это прекрасно работает, и после небольшой магии c # все, что упало где-либо в treview, дает мне отброшенный объект в виде байтового массива, который я могу использовать.

Вот проблема Регистрация TreeView черезinterop означает, что я не могу зарегистрировать его, используя его свойство AllowDrop.Попытка сделать оба выдает ошибку, сообщающую мне, что я могу зарегистрировать только один элемент управления для перетаскивания.Регистрация только через взаимодействие полностью обходит «управляемую» регистрацию, и что касается TreeView, то она не зарегистрирована, то есть я не получаю никаких событий перетаскивания и не могу обработать какие-либо отзывы пользователя.

Можно ли каким-либо образом использовать метод регистрации взаимодействия и в то же время сообщать тому же элементу управления, что он зарегистрирован для перетаскивания с помощью обычного метода winforms?В качестве альтернативы может кто-нибудь придумать какой-нибудь умный способ наложения элементов управления, чтобы я мог получить обратную связь от TreeView и пропущенное событие от зарегистрированного элемента управления взаимодействия?

Надеюсь, все это имеет смысл.

Огромное спасибозаранее за любые ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...