|
DragDrop
|
|||
---|---|---|---|
#18+
Имею некоторое wpf-дерево и реализую drag & drop процесс. Обработчики Enter / Over / Drop, во входных параметрах содержат информацию об источнике данных, сами данные и прочее. Как, узнать над каким узлом "пролетает" мышь, и на какой узел дерева производится "сброс"? В параметрах обработчиков я этого найти не смог. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 06:18 |
|
DragDrop
|
|||
---|---|---|---|
#18+
PreviewDrop, во входных параметрах предоставляет: sender, который указывает на TreeView и DragEventArgs, который содержит: - OriginalSource - тот элемент с которого мышь потащила данные - Data содержит сами данные Более ничего похожего на целевой элемент тут нет (как впрочем и в других preview и не только обработчиках). Попытка получить хоть что-то связанное с целевым элементом через мышь (в этих обработчиках) тоже не имеет успеха. Point pnt = Mouse.GetPosition(tree); DependencyObject dobj = tree.InputHitTest(pnt) as DependencyObject; Получает объект-источник перетаскивания. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 08:39 |
|
DragDrop
|
|||
---|---|---|---|
#18+
ЧитательX, попробуй использовать Nuget GongSolutions.Wpf.DragDrop- может в нем что-то получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 09:21 |
|
DragDrop
|
|||
---|---|---|---|
#18+
По поводу Gong Solutions. К сожалению я очень ограничен в праве подключать сторонние библиотеки. Поэтому, вынужден использовать только базовые .dotnet возможности. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 09:39 |
|
DragDrop
|
|||
---|---|---|---|
#18+
Так надо обрабатывать события каждого узла, а не дерева в целом. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 09:43 |
|
DragDrop
|
|||
---|---|---|---|
#18+
Что значит события каждого узла? Именно дерево предоставляет обработчики, которые возбуждаются при DragDrop манипуляциях. И если с узлом-источником все замечательно, то узел-приемник устойчиво определить не удается. А как завершить операцию если неизвестно для кого мышь притащила пакет? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 09:56 |
|
DragDrop
|
|||
---|---|---|---|
#18+
ЧитательX, как вариант для каждого узла своя модель, в которой есть команда. А для узлов Код: xml 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 10:02 |
|
DragDrop
|
|||
---|---|---|---|
#18+
не то событие Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 10:05 |
|
DragDrop
|
|||
---|---|---|---|
#18+
ЧитательXИменно дерево предоставляет обработчики, которые возбуждаютсяты же в wpf, а не в винформах. У тебя куча инструментов в руках - можно следить за всплывающими событиями, можно менять стили вложенных элементов и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 10:55 |
|
DragDrop
|
|||
---|---|---|---|
#18+
Shocker.Pro ты же в wpf, а не в винформах. У тебя куча инструментов в руках - можно следить за всплывающими событиями, можно менять стили вложенных элементов и т.п Ну если бы все это хорошо знать, тогда наверно будет все отлично. Будем пробовать. Спасибо за наводки по триггерам ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 12:00 |
|
DragDrop
|
|||
---|---|---|---|
#18+
https://msdn.microsoft.com/ru-ru/library/system.windows.drageventargs(v=vs.110).aspx Метод GetPosition может вернуть текущие координаты относительно вашего TreeView, по полученным координатам можно сделать HitTest и определить, что за элемент находится по данным координатам: VisualTreeHelper.HitTest() Как я понимаю, вам нужно перемещать внутри 1 дерева элементы ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 12:42 |
|
DragDrop
|
|||
---|---|---|---|
#18+
авторRoman Mejtes Да, перемещение внутри одного дерева. Я использовал: Point pnt = Mouse.GetPosition(Tree); DependencyObject dobj = Tree.InputHitTest(pnt) as DependencyObject; Проблема в том, что при переезде с одного узла на соседний узел, обработчик Enter, который должен фиксировать вход в новый узел срабатывает несколько раз (некий дребезг). При этом, иногда действительно вычисляется некоторый элемент в структуре TreeViewItem, из которого можно понять в какой объект дерева "въехала" мышь. Но, затем следует серия срабатываний Enter и при этом вычисляется null-object. Т.е. получить устойчивое значение целевого объекта не удается. Может быть, что-то удастся выудить из <Interaction.Trigger>. автор vb_sub Но, что-то берут сомнения. Насколько я понимаю нужно соорудить производный класс от Behavior, "прилепить" его к дереву и ловить срабатывание триггера. Но, AssociatedObject в этом классе получит все те же аргументы, что я сейчас получаю в обработчиках дерева. И триггер на событие Enter будет срабатывать по нескольку раз и целевой объект будет вычислятся по координатам то правильно, то null. Но, не буду забегать вперед. Нужно пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 13:57 |
|
DragDrop
|
|||
---|---|---|---|
#18+
ЧитательX, если бы я делал, то сначала бы создал класс (например TreeHolder), который будет DataContex'том для всего дерева. Потом создал бы класс (TreeNodeModel) с id, NavigateCommand, и другими свойствами, которые представляли собой бы узлы дерева, над которыми ты хочешь ловить MouseOver. И у TreeHolder был бы HashSet этих TreeNodeModel. Потом нужно правильно забиндить это дерево. И ловить команду от триггера. Не знаю рабочий или нет вариант, я бы начала с такого. Ну а чтобы кошерно сделать, нужен CommandListener. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2017, 15:03 |
|
DragDrop
|
|||
---|---|---|---|
#18+
vb_sub Какого-нибудь фрагмента рабочего кода случайно нет? Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2017, 05:25 |
|
DragDrop
|
|||
---|---|---|---|
#18+
Совершенно случайно нашел источник проблемы. Код: c# 1. 2.
Эти два способа получения координат в обработчиках Drag&Drop ведут себя по разному. В обработчике LeftMouseDown их результаты совпадают, но в обработчиках Enter, Over и Drop они дают совершенно разные результаты. Второй вариант работает правильно. Спасибо всем кто принял участие в обсуждении темы. Вопрос закрыт. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2017, 07:09 |
|
DragDrop
|
|||
---|---|---|---|
#18+
По событиям мышки и "дребезжанию" Любой Visual объект прямоугольный, но его границы в которых он "видим" по HitTest определяются не прямоугольником, а "видимой"\"закрашенной" геометрией этого элемента. Если взять контрол TextBlock и задать ему задний фон как Null, HitTest не будет срабатывать в области, где цвет отсутствует, то есть будет срабатывать только в отношении текста или на тот элемент, который находится под TextBlock и его область видимости находится в этой точке. По этому, каждый TreeViewItem должен иметь заданный цвет, если он прозрачный, то Transparent. Иначе при наведении мышки на этот объект, его можно просто ненайти. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2017, 10:00 |
|
|
start [/forum/topic.php?fid=21&fpage=8&tid=1440506]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
73ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 244ms |
total: | 420ms |
0 / 0 |