2012-05-23 3 views
3

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

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

Catalog 

    Brands 
    Nike 
    Adidas 
    Lactose 


    Styles 
    Sandles 
    Trainers 
    Boots 

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

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

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

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

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

ответ

2

Там может быть лучше всего подходит, но то, что я сделал это:

  • При перетаскивании над вашим целевым элементом (QueryContinueDrag) вы проверяете, если контроль вы над ScrollViewer имеет в своем визуальном дереве.

  • Теперь проверьте, находитесь ли вы рядом с краем scrollviewer, например. 10px прочь.

  • прокручивайте ScrollViewer

Вот код:

Найти связанный ScrollViewer:

var _scrollViewerControl = FindVisualChild<ScrollViewer>(treeView); 

private childItem FindVisualChild<childItem>(DependencyObject obj) 
where childItem : DependencyObject 
{ 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
    { 
    DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
    if (child != null && child is childItem) 
     return (childItem)child; 
    else 
    { 
     childItem childOfChild = FindVisualChild<childItem>(child); 
     if (childOfChild != null) 
     return childOfChild; 
    } 
    } 
    return null; 
} 

В QueryContinueDrag определения текущего положения и дельту ScrollViewer:

// as we don't have eventargs here exposing the current mouse position we use the 
// win32 API to get the current mouse position 
Win32.POINT p; 
if (!Win32.GetCursorPos(out p)) 
{ 
    return; 
} 

//this is the point on the screen 
Point point = new Point(p.X, p.Y); 

//get position relative to scrollViewerControl 
Point controlPoint = _scrollViewerControl.PointFromScreen(point); 

if (controlPoint.Y < 10 && -10 < controlPoint.Y) 
{ 
    _scrollViewerControl.LineUp(); 
} 
else if (controlPoint.Y > _scrollViewerControl.ViewportHeight - 10 && _scrollViewerControl.ViewportHeight + 10 > controlPoint.Y) 
{ 
    _scrollViewerControl.LineDown(); 
} 

if (controlPoint.X < 10 && -10 < controlPoint.X) 
{ 
    _scrollViewerControl.LineLeft(); 
} 
else if (controlPoint.X > _scrollViewerControl.ViewportWidth - 10 && _scrollViewerControl.ViewportWidth + 10 > controlPoint.X) 
{ 
    _scrollViewerControl.LineRight(); 
} 
+0

Как это глупо, как бы это реализовать? Хотел бы я сделать это в классах DragDropManager? –

+0

Я не знаю, как выглядит ваша реализация класса DragDropManager, но то, что я сделал, это реализовать ее там. Я предполагаю, что у вас уже есть какие-то перехватчики событий, и что вы знаете подробности операции перетаскивания. Например. который начал операцию перетаскивания. Лучше всего вы покажете небольшой пример своей реализации в своем вопросе, чтобы мы могли лучше понять? – SvenG

+0

Ну, дело в вашем предыдущем ответе, я действительно не знаю, где находится scrollviewer, так как я уверен, что шаблон TreeView уже встроен в него, потому что, насколько я вижу, нет ничего действительно инициализирующего scollbar –

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