2012-05-24 7 views
10

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

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

Catalog 

    Brands 
    Nike 
    Adidas 
    Lactose 

    Styles 
    Sandles 
    Trainers 
    Boots 

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

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

Скроллинг работает отлично, без перетаскивания.

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

Я прочитал несколько статей и просто оставил царапины в голове.

ответ

17

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

Attached Behavior for auto scrolling containers while doing Drag & Drop

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

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 Listbox auto scroll while dragging

WPF ListView Databound Drag/Drop Auto Scroll

WPF Drag-to-scroll doesn't work correctly

+0

Я пытался использовать это на моем ListBox, но он не работает, если элементы в ListBox не может быть сброшена на. У меня есть смешанные элементы в списке, некоторые могут быть отброшены, некоторые не могут. Если те, кто находится рядом с верхней (или нижней), не могут получить капли, прокрутка не активируется. Какие-нибудь идеи об этом? –

+0

@ Lutz, что очень интересно, никогда не сталкивался с таким сценарием, поэтому не могу сказать много. Я могу думать о 1. Добавьте некоторые фиктивные элементы между текущими элементами (с небольшой высотой и т. Д., Чтобы они не выглядели нечетно или пустыми), сделайте их недоступными, чтобы для них всегда вызывался PreviewDragOver. Но вам придется обрабатывать капли и т. Д. 2. Сделать все элементы падающими и обрабатывать валидацию после падения. 3. Попробуйте найти, если какое-либо другое событие будет запущено для этих предметов, которые не подлежат обрыву. – akjoshi

Смежные вопросы