(VB.NET + WPF) Перетаскивание (удаление пользователем) элементов стековой панели в Scrollviewer? - PullRequest
0 голосов
/ 08 января 2010

У меня есть хорошая модель (я думаю!), Позволяющая пользователю перетаскивать элемент в панели стека и перемещать его в другое место внутри панели стека.

Однако моя панель стека расположена в ScrollViewer, как это (обобщенно):

<ScrollViewer>
   <StackPanel>
        ....First item
        ....Second item
        ....Third item
        ....Etc.
    </StackPanel>
<ScrollViewer>

Вот проблема, я хочу смоделировать функциональность таких программ, как word, где, если я перетаскиваю выделенный контент (или объект) за пределы видимой области, окно прокручивается в направлении мыши, чтобы увидеть больше мест бросить мой изящный маленький предмет.

... т.е. Если при перетаскивании содержимого панели стека перемещать мышь к верхней части моего ScrollViewer, я хочу, чтобы средство просмотра прокрутки медленно перемещалось вверх, чтобы я мог видеть больше мест, где можно было бы уронить мой контент.

Есть предложения?

Если вы поможете мне решить эту проблему, вы станете находкой!

1 Ответ

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

Нет проблем. Обработайте перенаправленное событие DragOver на уровне ScrollViewer. Получить позицию. Если он находится ближе к верху границ ScrollViewer, прокрутите вверх. Если он находится в нижней части границ ScrollViewer, прокрутите вниз.

Сама прокрутка выполняется путем вызова scrollViewer.LineUp() или scrollViewer.LineDown().

События DragOver происходят часто, поэтому сохраняйте значение DateTime.Now в поле каждый раз, когда вы вызываете LineUp() или LineDown(). Прежде чем звонить им снова, проверьте DateTime.Now и, если прошло недостаточно времени, не звоните LineUp() или LineDown().

Для лучшего контроля скорости прокрутки вы можете использовать scrollViewer.ScrollToVerticalOffset(scrollViewer.ContentVerticalOffset + delta) вместо scrollViewer.LineUp() и scrollViewer.LineDown().

Вы можете обеспечить лучшее взаимодействие с пользователем, если разрешите более быструю прокрутку, когда будете ближе к верхней или нижней части средства просмотра прокрутки. Это можно сделать, разделив область прокрутки на зоны или рассчитав скорость из положения мыши. В этом случае изменение скорости можно выполнить, вызывая LineUp()/LineDown() несколько раз, когда он ближе к краю, или увеличивая значение delta, если вы используете ScrollToVerticalOffset. Вероятно, вам не следует изменять время (сравнение DateTime.Now) для этой цели, потому что оно будет ненадежным.

...