Silverlight MouseDragElementBehavior. Как переставить элементы после перетаскивания?

У меня есть панель стека с настраиваемыми элементами управления. Пользователь может добавлять или удалять элементы.

Я прикрепил MouseDragElementBehavior к каждому элементу. Итак, теперь пользователь может перемещать их внутри панели стека.

Однако теперь предметы расставлены произвольно. Это действительно беспорядок. Они остаются там, где их оставил пользователь.

Что мне сейчас нужно, так это сделать так, чтобы они складывались так, как должна быть панель стека ... Красиво, одну за другой ...

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

Есть событие DragFinished, но я действительно не вижу, как Behavior перемещает элементы. Я думал, что это маржа, она меняется, но поля остаются равными нулю ... Я не знаю, что делать дальше.

Ценю небольшую помощь.


person Community    schedule 09.03.2010    source источник


Ответы (1)


MouseDragElementBehavior выполняет свою работу, используя Transform для свойства RenderTransform присоединенного элемента (то есть того, к которому применяется поведение) (точный тип преобразования зависит от состояния свойства RenderTransform, но это будет либо TranslateTransform, либо MatrixTransform) .

Преобразование не сбрасывается, когда вы заканчиваете перетаскивание (и вы бы этого не хотели, потому что элемент вернется в свое положение в StackPanel, когда вы начали перетаскивание), и поэтому элемент остается там, где «пользователь оставил их».

Чтобы изменить положение элементов в StackPanel так, как вы говорите, вам нужно будет использовать событие DragFinished. Что вы, вероятно, захотите сделать, так это выяснить, где в StackPanel окажется элемент (в результате перетаскивания, то есть какой элемент на панели он будет "толкать" вниз), а затем создать анимацию для анимации элемента из его текущего положение (где пользователь отпустил перетаскивание) в эту последнюю позицию в StackPanel и другую анимацию, чтобы переместить «толкаемый» элемент в его новую позицию в StackPanel (VisualTreeHelper, вероятно, может здесь помочь (я думаю)). После завершения этих анимаций просто установите новый индекс в StackPanel для каждого элемента и удалите перевод RenderTransform.

person Simon Fox    schedule 09.03.2010
comment
спасибо за совет по преобразованию. Собираюсь завтра испытать. - person ; 10.03.2010
comment
работает отлично. единственная проблема сейчас в том, что я сделал все это на основе панели стека ... так что если я перетащу элемент вправо - он переместится под другие элементы ... Для этого нужно задать другой вопрос :) Не уверен, может ли избегать... - person ; 10.03.2010
comment
вот решение для скрытого элемента: stackoverflow.com/questions/2416172/ - person ; 17.03.2010
comment
Привет, Саймон, Есть ли шанс, что вы предоставите более подробную информацию о реализации? Мне это тоже нужно в моем проекте! Спасибо ! - person Thomas LEBRUN; 23.08.2013