Вопрос по treeview, c#, wpf – Прокрутка при перетаскивании (WPF)

10

Хорошо, ребята, я почесал голову как сумасшедший из-за этой проблемы и провел много часов, пытаясь выяснить, как это работает, но я все еще не нашел ответа, если вы хотите, чтобы кто-нибудь из моих SRC не стеснялся спрашивать это, и я посмотрю, смогу ли я помочь.

По сути, у меня проблема в том, что у меня естьTreeView папок в моем приложении, т.е.

Catalog

  Brands
    Nike
    Adidas
    Lactose

  Styles
    Sandles
    Trainers
    Boots

Проблема, которую я пытаюсь исправить, заключается в том, что когда я перетаскиваю папку (это обрабатывается в моемDragDropManager класс), я не могу прокрутить вверх или вниз (просто показывает прекрасный знак остановки). Я также не могу найти скроллер на самом деле в древовидной структуре, поэтому я не уверен, как он генерируется (Это не мое собственное программное обеспечение, я недавно начал работать в компании, поэтому я не знаком с кодом, и никто другой кажется, знает.)

Это проблема, если я хочу переместить что-то с самого верха до самого низа.

Прокрутка прекрасно работает сама по себе, без перетаскивания.

Если кто-то захочет увидеть какую-либо часть моего кода, не стесняйтесь спрашивать, поскольку я не уверен, что на самом деле показать вам, ребята.

Я прочитал много хороших статей, и мне осталось только почесать голову.

Ваш Ответ

1   ответ
20

Я создал прикрепленное свойство для достижения этого поведения, посмотрите мой пост здесь -

Прикрепленное поведение для автоматической прокрутки контейнеров при выполнении Drag & amp; Капля

Основная логика примерно такая -

private static void OnContainerPreviewDragOver(object sender, DragEventArgs e)
{
    FrameworkElement container = sender as FrameworkElement;

    if (container == null) { return; }

    ScrollViewer scrollViewer = GetFirstVisualChild<ScrollViewer>(container);

    if (scrollViewer == null) { return; }

    double tolerance = 60;
    double verticalPos = e.GetPosition(container).Y;
    double offset = 20;

    if (verticalPos < tolerance) // Top of visible list? 
    {
        //Scroll up
        scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - offset);
    }
    else if (verticalPos > container.ActualHeight - tolerance) //Bottom of visible list? 
    {
        //Scroll down
        scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + offset);     
    }
}

Похожие вопросы по SO (хотя они в основном дляListBox/ListView но должен работать наTreeView тоже) -

Автоматическая прокрутка списка WPF при перетаскивании

WPF ListView Databound Drag / Drop Auto Scroll

WPF Drag-to-scroll не работает правильно

не работает .....
@akjoshi - я добавил ваш код точно так, как вы указали. но когда я добавляю строку «WpfExtensions: DragDropExtension.ScrollOnDragDrop = & quot; True & quot;» для моего ListView это дает мне ошибку intelisense: "имя DragDropExtension не существует в пространстве имен" clr-namespace: WpfExtensions & apos; & Quot;
Я пытался использовать это в своем списке, но он не работает, если элементы списка не могут быть сброшены. У меня есть смешанные элементы в списке, некоторые из них могут быть добавлены, некоторые не могут. Если те, которые находятся сверху (или снизу), не могут принимать капли, прокрутка не активируется. Есть какие-нибудь идеи по поводу этого?
@nikotromus, не могли бы вы рассказать, что не работает? и твой сценарий и т. д.!
@Lutz, который очень интересен, никогда не сталкивался с таким сценарием, так что не могу сказать много. Я могу подумать о 1. Добавьте несколько фиктивных элементов между текущими элементами (с небольшой высотой и т. Д., Чтобы они не выглядели странно или не занимали пустое место), чтобы их можно было сбрасывать, чтобы для них всегда вызывался PreviewDragOver. Но вам придется справиться с падением и т. Д. 2. Сделайте все предметы сбрасываемыми и проведите проверку после сброса. 3. Попытайтесь выяснить, происходит ли какое-либо другое событие для этих предметов, не подлежащих сбросу.

Похожие вопросы