powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DragDrop
17 сообщений из 17, страница 1 из 1
DragDrop
    #39509088
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имею некоторое wpf-дерево и реализую drag & drop процесс.
Обработчики Enter / Over / Drop, во входных параметрах содержат информацию об источнике данных, сами данные и прочее.
Как, узнать над каким узлом "пролетает" мышь, и на какой узел дерева производится "сброс"?
В параметрах обработчиков я этого найти не смог.
...
Рейтинг: 0 / 0
DragDrop
    #39509105
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PrewiewDrop
...
Рейтинг: 0 / 0
DragDrop
    #39509112
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PreviewDrop, во входных параметрах предоставляет:
sender, который указывает на TreeView
и DragEventArgs, который содержит:
- OriginalSource - тот элемент с которого мышь потащила данные
- Data содержит сами данные
Более ничего похожего на целевой элемент тут нет (как впрочем и в других preview и не только обработчиках).

Попытка получить хоть что-то связанное с целевым элементом через мышь (в этих обработчиках) тоже не имеет успеха.
Point pnt = Mouse.GetPosition(tree);
DependencyObject dobj = tree.InputHitTest(pnt) as DependencyObject;

Получает объект-источник перетаскивания.
...
Рейтинг: 0 / 0
DragDrop
    #39509120
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательX,
попробуй использовать Nuget GongSolutions.Wpf.DragDrop- может в нем что-то получится.
...
Рейтинг: 0 / 0
DragDrop
    #39509125
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу Gong Solutions.
К сожалению я очень ограничен в праве подключать сторонние библиотеки.
Поэтому, вынужден использовать только базовые .dotnet возможности.
...
Рейтинг: 0 / 0
DragDrop
    #39509126
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так надо обрабатывать события каждого узла, а не дерева в целом.
...
Рейтинг: 0 / 0
DragDrop
    #39509132
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что значит события каждого узла? Именно дерево предоставляет обработчики, которые возбуждаются при DragDrop манипуляциях.
И если с узлом-источником все замечательно, то узел-приемник устойчиво определить не удается. А как завершить операцию если неизвестно для кого мышь притащила пакет?
...
Рейтинг: 0 / 0
DragDrop
    #39509135
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательX,
как вариант для каждого узла своя модель, в которой есть команда.
А для узлов
Код: xml
1.
2.
3.
4.
5.
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseUp">
      <i:InvokeCommandAction Command="{Binding MyCommand}"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
...
Рейтинг: 0 / 0
DragDrop
    #39509137
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не то событие
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
 <i:Interaction.Triggers>

        <i:EventTrigger EventName="MouseEnter">

            <i:InvokeCommandAction Command="{Binding NavigateCommand}"   CommandParameter="ViewImportProgress"/>

        </i:EventTrigger>

    </i:Interaction.Triggers>
...
Рейтинг: 0 / 0
DragDrop
    #39509164
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательXИменно дерево предоставляет обработчики, которые возбуждаютсяты же в wpf, а не в винформах. У тебя куча инструментов в руках - можно следить за всплывающими событиями, можно менять стили вложенных элементов и т.п.
...
Рейтинг: 0 / 0
DragDrop
    #39509212
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro ты же в wpf, а не в винформах. У тебя куча инструментов в руках - можно следить за всплывающими событиями, можно менять стили вложенных элементов и т.п
Ну если бы все это хорошо знать, тогда наверно будет все отлично.
Будем пробовать. Спасибо за наводки по триггерам
...
Рейтинг: 0 / 0
DragDrop
    #39509247
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://msdn.microsoft.com/ru-ru/library/system.windows.drageventargs(v=vs.110).aspx
Метод GetPosition может вернуть текущие координаты относительно вашего TreeView, по полученным координатам можно сделать HitTest и определить, что за элемент находится по данным координатам:
VisualTreeHelper.HitTest()
Как я понимаю, вам нужно перемещать внутри 1 дерева элементы
...
Рейтинг: 0 / 0
DragDrop
    #39509331
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор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.
Но, не буду забегать вперед. Нужно пробовать.
...
Рейтинг: 0 / 0
DragDrop
    #39509398
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЧитательX,
если бы я делал, то сначала бы создал класс (например TreeHolder),
который будет DataContex'том для всего дерева. Потом создал бы класс (TreeNodeModel) с id, NavigateCommand, и другими свойствами, которые представляли собой бы узлы дерева, над которыми ты хочешь ловить MouseOver. И у TreeHolder был бы HashSet этих TreeNodeModel.
Потом нужно правильно забиндить это дерево. И ловить команду от триггера. Не знаю рабочий или нет вариант, я бы начала с такого.
Ну а чтобы кошерно сделать, нужен CommandListener.
...
Рейтинг: 0 / 0
DragDrop
    #39509673
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Какого-нибудь фрагмента рабочего кода случайно нет?
Код: c#
1.
(хотелось бы в общих чертах понять о чем говорит иностранец :-) - цитата)
...
Рейтинг: 0 / 0
DragDrop
    #39509679
ЧитательX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Совершенно случайно нашел источник проблемы.
Код: c#
1.
2.
Point pnt= Mouse.GetPosition(Tree);
Point pnt= e.GetPosition(Tree);


Эти два способа получения координат в обработчиках Drag&Drop ведут себя по разному.
В обработчике LeftMouseDown их результаты совпадают,
но в обработчиках Enter, Over и Drop они дают совершенно разные результаты.
Второй вариант работает правильно.

Спасибо всем кто принял участие в обсуждении темы. Вопрос закрыт.
...
Рейтинг: 0 / 0
DragDrop
    #39509709
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По событиям мышки и "дребезжанию"
Любой Visual объект прямоугольный, но его границы в которых он "видим" по HitTest определяются не прямоугольником, а "видимой"\"закрашенной" геометрией этого элемента.
Если взять контрол TextBlock и задать ему задний фон как Null, HitTest не будет срабатывать в области, где цвет отсутствует, то есть будет срабатывать только в отношении текста или на тот элемент, который находится под TextBlock и его область видимости находится в этой точке.
По этому, каждый TreeViewItem должен иметь заданный цвет, если он прозрачный, то Transparent. Иначе при наведении мышки на этот объект, его можно просто ненайти.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DragDrop
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]