@@ -23,141 +23,136 @@ public DropTargetInsertionAdorner(UIElement adornedElement, DropInfo dropInfo)
2323 protected override void OnRender ( DrawingContext drawingContext )
2424 {
2525 var dropInfo = this . DropInfo ;
26- var itemsControl = dropInfo . VisualTarget as ItemsControl ;
2726
28- if ( itemsControl != null )
27+ if ( dropInfo . VisualTarget is not ItemsControl itemsControl )
2928 {
30- // Get the position of the item at the insertion index. If the insertion point is
31- // to be after the last item, then get the position of the last item and add an
32- // offset later to draw it at the end of the list.
33- ItemsControl itemParent ;
29+ return ;
30+ }
3431
35- var visualTargetItem = dropInfo . VisualTargetItem ;
36- if ( visualTargetItem != null )
37- {
38- itemParent = ItemsControl . ItemsControlFromItemContainer ( visualTargetItem ) ;
39- }
40- else
41- {
42- itemParent = itemsControl ;
43- }
32+ // Get the position of the item at the insertion index. If the insertion point is
33+ // to be after the last item, then get the position of the last item and add an
34+ // offset later to draw it at the end of the list.
35+
36+ var visualTargetItem = dropInfo . VisualTargetItem ;
37+ var itemParent = visualTargetItem != null ? ItemsControl . ItemsControlFromItemContainer ( visualTargetItem ) : itemsControl ;
4438
45- // this could be happen with a thread scenario where items are removed very quickly
46- if ( itemParent == null )
39+ // this could be happen with a thread scenario where items are removed very quickly
40+ if ( itemParent == null )
41+ {
42+ return ;
43+ }
44+
45+ var itemsCount = itemParent . Items . Count ;
46+ var index = Math . Min ( dropInfo . InsertIndex , itemsCount - 1 ) ;
47+
48+ var lastItemInGroup = false ;
49+ var targetGroup = dropInfo . TargetGroup ;
50+ if ( targetGroup != null && targetGroup . IsBottomLevel && dropInfo . InsertPosition . HasFlag ( RelativeInsertPosition . AfterTargetItem ) )
51+ {
52+ var indexOf = targetGroup . Items . IndexOf ( dropInfo . TargetItem ) ;
53+ lastItemInGroup = indexOf == targetGroup . ItemCount - 1 ;
54+ if ( lastItemInGroup && dropInfo . InsertIndex != itemsCount )
4755 {
48- return ;
56+ index -- ;
4957 }
58+ }
5059
51- var itemsCount = itemParent . Items . Count ;
52- var index = Math . Min ( dropInfo . InsertIndex , itemsCount - 1 ) ;
60+ var itemContainer = ( UIElement ) itemParent . ItemContainerGenerator . ContainerFromIndex ( index ) ;
5361
54- var lastItemInGroup = false ;
55- var targetGroup = dropInfo . TargetGroup ;
56- if ( targetGroup != null && targetGroup . IsBottomLevel && dropInfo . InsertPosition . HasFlag ( RelativeInsertPosition . AfterTargetItem ) )
62+ var showAlwaysDropTargetAdorner = itemContainer == null && DragDrop . GetShowAlwaysDropTargetAdorner ( itemParent ) ;
63+ if ( showAlwaysDropTargetAdorner )
64+ {
65+ itemContainer = itemParent ;
66+ }
67+
68+ if ( itemContainer == null )
69+ {
70+ return ;
71+ }
72+
73+ var itemRect = new Rect ( itemContainer . TranslatePoint ( new Point ( ) , this . AdornedElement ) , itemContainer . RenderSize ) ;
74+ Point point1 ,
75+ point2 ;
76+ double rotation = 0 ;
77+
78+ // If the ItemsControl has a scrollable content then try to get the viewport width/height
79+ // to paint the insertion adorner only on this size.
80+ var viewportWidth = double . MaxValue ;
81+ var viewportHeight = double . MaxValue ;
82+ if ( dropInfo . TargetScrollViewer != null )
83+ {
84+ if ( dropInfo . TargetScrollViewer . ScrollableWidth != 0 )
5785 {
58- var indexOf = targetGroup . Items . IndexOf ( dropInfo . TargetItem ) ;
59- lastItemInGroup = indexOf == targetGroup . ItemCount - 1 ;
60- if ( lastItemInGroup && dropInfo . InsertIndex != itemsCount )
61- {
62- index -- ;
63- }
86+ viewportWidth = dropInfo . TargetScrollViewer . ViewportWidth ;
6487 }
6588
66- var itemContainer = ( UIElement ) itemParent . ItemContainerGenerator . ContainerFromIndex ( index ) ;
67-
68- var showAlwaysDropTargetAdorner = itemContainer == null && DragDrop . GetShowAlwaysDropTargetAdorner ( itemParent ) ;
69- if ( showAlwaysDropTargetAdorner )
89+ if ( dropInfo . TargetScrollViewer . ScrollableHeight != 0 )
7090 {
71- itemContainer = itemParent ;
91+ viewportHeight = dropInfo . TargetScrollViewer . ViewportHeight ;
7292 }
93+ }
7394
74- if ( itemContainer != null )
95+ if ( dropInfo . VisualTargetOrientation == Orientation . Vertical )
96+ {
97+ if ( ( dropInfo . InsertIndex == itemsCount ) || lastItemInGroup )
7598 {
76- var itemRect = new Rect ( itemContainer . TranslatePoint ( new Point ( ) , this . AdornedElement ) , itemContainer . RenderSize ) ;
77- Point point1 ,
78- point2 ;
79- double rotation = 0 ;
80-
81- // I really don't know why I did this
82- //
83- // var viewportWidth = double.MaxValue;
84- // var viewportHeight = double.MaxValue;
85- // if (DropInfo.TargetScrollViewer != null)
86- // {
87- // if (DropInfo.TargetScrollViewer.ScrollableWidth != 0)
88- // {
89- // viewportWidth = DropInfo.TargetScrollViewer.ViewportWidth;
90- // }
91- //
92- // if (DropInfo.TargetScrollViewer.ScrollableHeight != 0)
93- // {
94- // viewportHeight = DropInfo.TargetScrollViewer.ViewportHeight;
95- // }
96- // }
97-
98- if ( dropInfo . VisualTargetOrientation == Orientation . Vertical )
99+ if ( itemsCount > 0 )
99100 {
100- if ( ( dropInfo . InsertIndex == itemsCount ) || lastItemInGroup )
101- {
102- if ( itemsCount > 0 )
103- {
104- itemRect . Y += itemContainer . RenderSize . Height ;
105- }
106- else
107- {
108- if ( ( itemsControl as ListView ) ? . View is GridView )
109- {
110- var header = itemsControl . GetVisualDescendent < GridViewHeaderRowPresenter > ( ) ;
111- if ( header != null )
112- {
113- itemRect . Y += header . RenderSize . Height ;
114- }
115- }
116- else if ( itemsControl is DataGrid )
117- {
118- var header = itemsControl . GetVisualDescendent < DataGridColumnHeadersPresenter > ( ) ;
119- if ( header != null )
120- {
121- itemRect . Y += header . RenderSize . Height ;
122- }
123- }
124-
125- itemRect . Y += this . Pen . Thickness ;
126- }
127- }
128-
129- var itemRectRight = itemRect . Right ; //Math.Min(itemRect.Right, viewportWidth);
130- var itemRectLeft = itemRect . X < 0 ? 0 : itemRect . X ;
131- point1 = new Point ( itemRectLeft , itemRect . Y ) ;
132- point2 = new Point ( itemRectRight , itemRect . Y ) ;
101+ itemRect . Y += itemContainer . RenderSize . Height ;
133102 }
134103 else
135104 {
136- if ( dropInfo . InsertIndex == itemsCount )
105+ if ( ( itemsControl as ListView ) ? . View is GridView )
137106 {
138- if ( itemsCount > 0 )
107+ var header = itemsControl . GetVisualDescendent < GridViewHeaderRowPresenter > ( ) ;
108+ if ( header != null )
139109 {
140- itemRect . X += itemContainer . RenderSize . Width ;
110+ itemRect . Y += header . RenderSize . Height ;
141111 }
142- else
112+ }
113+ else if ( itemsControl is DataGrid )
114+ {
115+ var header = itemsControl . GetVisualDescendent < DataGridColumnHeadersPresenter > ( ) ;
116+ if ( header != null )
143117 {
144- itemRect . X += this . Pen . Thickness ;
118+ itemRect . Y += header . RenderSize . Height ;
145119 }
146120 }
147121
148- var itemRectTop = itemRect . Y < 0 ? 0 : itemRect . Y ;
149- var itemRectBottom = itemRect . Bottom ; //Math.Min(itemRect.Bottom, viewportHeight);
150-
151- point1 = new Point ( itemRect . X , itemRectTop ) ;
152- point2 = new Point ( itemRect . X , itemRectBottom ) ;
153- rotation = 90 ;
122+ itemRect . Y += this . Pen . Thickness ;
154123 }
124+ }
155125
156- drawingContext . DrawLine ( this . Pen , point1 , point2 ) ;
157- this . DrawTriangle ( drawingContext , point1 , rotation ) ;
158- this . DrawTriangle ( drawingContext , point2 , 180 + rotation ) ;
126+ var itemRectRight = Math . Min ( itemRect . Right , viewportWidth ) ;
127+ var itemRectLeft = itemRect . X < 0 ? 0 : itemRect . X ;
128+ point1 = new Point ( itemRectLeft , itemRect . Y ) ;
129+ point2 = new Point ( itemRectRight , itemRect . Y ) ;
130+ }
131+ else
132+ {
133+ if ( dropInfo . InsertIndex == itemsCount )
134+ {
135+ if ( itemsCount > 0 )
136+ {
137+ itemRect . X += itemContainer . RenderSize . Width ;
138+ }
139+ else
140+ {
141+ itemRect . X += this . Pen . Thickness ;
142+ }
159143 }
144+
145+ var itemRectTop = itemRect . Y < 0 ? 0 : itemRect . Y ;
146+ var itemRectBottom = Math . Min ( itemRect . Bottom , viewportHeight ) ;
147+
148+ point1 = new Point ( itemRect . X , itemRectTop ) ;
149+ point2 = new Point ( itemRect . X , itemRectBottom ) ;
150+ rotation = 90 ;
160151 }
152+
153+ drawingContext . DrawLine ( this . Pen , point1 , point2 ) ;
154+ this . DrawTriangle ( drawingContext , point1 , rotation ) ;
155+ this . DrawTriangle ( drawingContext , point2 , 180 + rotation ) ;
161156 }
162157
163158 private void DrawTriangle ( DrawingContext drawingContext , Point origin , double rotation )
0 commit comments