I'm still messing around with this exact same issue too. I'm using a slightly modified version of Bea's Drag and Drop found here which is in VB instead of C#. When I used ScrollIntoView as described above, I could scroll down but not up.So I messed around and came up with this as my DropTarget_PreviewDragOver.
I'm still messing around with this exact same issue too. I'm using a slightly modified version of Bea's Drag and Drop found here, which is in VB instead of C#. When I used ScrollIntoView as described above, I could scroll down but not up.So I messed around and came up with this as my DropTarget_PreviewDragOver: Private Sub DropTarget_PreviewDragOver(ByVal sender As Object, ByVal e As DragEventArgs) Dim draggedItem As Object = e.Data.
GetData(Me. M_format. Name) Me.
DecideDropTarget(e) If (Not draggedItem Is Nothing) Then If (TypeOf m_targetItemsControl Is ListBox) Then Dim lb As ListBox = CType(m_targetItemsControl, ListBox) Dim temp As Integer = m_insertionIndex Dim scroll As ScrollViewer = Utilities. GetScrollViewer(lb) If scroll. VerticalOffset = temp Then temp -= 1 End If If temp >= 0 And temp Items(temp)) End If End If Me.
ShowDraggedAdorner(e. GetPosition(Me. M_topWindow)) Me.
UpdateInsertionAdornerPosition() End If e. Handled = True End Sub and I had to include this utility function, taken from here Public Shared Function GetScrollViewer(ByVal listBox As ListBox) Dim scroll_border As Decorator = CType(VisualTreeHelper. GetChild(listBox, 0), Decorator) If (TypeOf scroll_border Is Decorator) Then Dim scroll As ScrollViewer = CType(scroll_border.
Child, ScrollViewer) If (TypeOf scroll Is ScrollViewer) Then Return scroll Else Return Nothing End If Else Return Nothing End If End Function which is great and all. Then running out what theuberk mentioned above with the adorner moving, and in the spirit of making this easy for someone else later, I added a variable to the DragDropAdorner class: Private m_mouseDelta As Point Added this to the last line of DragSource_PreviewMouseLeftButtonDown: Me. M_mouseDelta = e.
GetPosition(m_sourceItemContainer) And turned ShowDraggedAdorner into: Private Sub ShowDraggedAdorner(ByVal currentPosition As Point) If (Me. M_draggedAdorner Is Nothing) Then Dim adornerLayer As AdornerLayer = adornerLayer. GetAdornerLayer(Me.
M_topWindow. Content) Me. M_draggedAdorner = New DraggedAdorner(Me.
M_draggedData, DragDropBehavior. GetDragTemplate(Me. M_sourceItemsControl), m_topWindow.
Content, adornerLayer) End If Me. M_draggedAdorner. SetPosition((currentPosition.
X - m_mouseDelta. X), (currentPosition. Y - m_mouseDelta.
Y)) End Sub.
I finally got to implementing this and testing it really quick. Looks great! Worked just fine!
Thanks! – ScottN Oct 19 '09 at 19:43 I did find one problem though, I was using double clicking on the list box as an alternative to dragging items between two controls. Using the method like above it was having problems detecting a single click between a double click and the source list would have the item added back what I just removed.So in the mouse down function I added "If e.
Clicks = 1 Then Do Drag Else Set DraggedData = Nothing", that should fix it. – ScottN Oct 19 '09 at 22:35.
What I did was took advantage of the ListBox. ScrollIntoView method. Basically, when you update your drop target, you can just call this method on it and wpf will do all the work.
All you need to know is the index of the drop target item. This handles both vertical and horizontal scrolling. This.listView.
ScrollIntoView(this.listView. Itemsindex); When you use this method, your adorner might move with the scrolling ListBox. To fix this, I just set my adorner parent and adorner layer parent to the content of the window at the top of the visual tree (i.e.TopWindow.
Content).
I'll give this a try, thanks for posting 3 months later :) I thought it was forgotten about.. – ScottN Jun 8 '09 at 22:57.
Another possibility to scroll is to use the ScrollBar-Commands. You can do this without climbing down the VisualTree. If you have a styles ListBox with no border the GetScrollViewer()-Method would not work anymore.
I use the first Element of the ItemContainerGenerator as CommandTarget for the ScrollBar. LineXXXCommand: Point p = e. GetPosition(itemsControl); IInputElement commandTarget = itemsControl.
ItemContainerGenerator. ContainerFromIndex(0) as IInputElement; if (commandTarget! = null) { if (p.
Y itemsControl. ActualHeight - OFFSET_TO_SCROLL) ScrollBar.LineDownCommand. Execute(null, commandTarget); if (p.
X itemsControl. ActualWidth - OFFSET_TO_SCROLL) ScrollBar. LineRightCommand.
Execute(null, commandTarget); } Calling the LineXXXCommands is similiar to clicking the Arrow-Buttons of a ScrollBar: The ScrollViewer scrolles by a certain ammount which you can configure by setting the 'SmallAmount' Property of the ScrollBar.
I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.