void area_DragDelta(object sender, DragAreaItemArgs<DragDeltaEventArgs> e) { m_RowsAreaContainer.IsReadyToDrop = false; m_ColumnsAreaContainer.IsReadyToDrop = false; m_FilterAreaContainer.IsReadyToDrop = false; m_DataAreaContainer.IsReadyToDrop = false; Point m_DragDelta = new Point(m_PrevDrag.X + e.Args.HorizontalChange, m_PrevDrag.Y + e.Args.VerticalChange); PivotAreaContainer container = sender as PivotAreaContainer; // Подсветка областей, куда разрешено таскание if (container != m_RowsAreaContainer) { Rect m_RowsArea_Bounds = AgControlBase.GetSLBounds(m_RowsAreaContainer); if (m_RowsArea_Bounds.Contains(m_DragDelta) && CanDragToArea(m_RowsAreaContainer, e.Item)) { m_RowsAreaContainer.IsReadyToDrop = true; } } if (container != m_ColumnsAreaContainer) { Rect m_ColumnsArea_Bounds = AgControlBase.GetSLBounds(m_ColumnsAreaContainer); if (m_ColumnsArea_Bounds.Contains(m_DragDelta) && CanDragToArea(m_ColumnsAreaContainer, e.Item)) { m_ColumnsAreaContainer.IsReadyToDrop = true; } } if (container != m_FilterAreaContainer) { Rect m_FilterArea_Bounds = AgControlBase.GetSLBounds(m_FilterAreaContainer); if (m_FilterArea_Bounds.Contains(m_DragDelta) && CanDragToArea(m_FilterAreaContainer, e.Item)) { m_FilterAreaContainer.IsReadyToDrop = true; } } if (container != m_DataAreaContainer) { Rect m_DataArea_Bounds = AgControlBase.GetSLBounds(m_DataAreaContainer); if (m_DataArea_Bounds.Contains(m_DragDelta) && CanDragToArea(m_DataAreaContainer, e.Item)) { m_DataAreaContainer.IsReadyToDrop = true; } } m_PrevDrag = m_DragDelta; }
void area_DragStarted(object sender, DragAreaItemArgs<DragStartedEventArgs> e) { m_DragStart = new Point(e.Args.HorizontalOffset, e.Args.VerticalOffset); m_PrevDrag = m_DragStart; }
void area_DragCompleted(object sender, DragAreaItemArgs<DragCompletedEventArgs> e) { try { PivotAreaContainer container = sender as PivotAreaContainer; if (container != null) { Point point = new Point(m_DragStart.X + e.Args.HorizontalChange, m_DragStart.Y + e.Args.VerticalChange); // Если перетаскивание за пределы контрола, содержащего все 4 области, то удалить элемент списка (102.94164) if (!AgControlBase.GetSLBounds(Areas_LayoutRoot).Contains(point)) { container.RemoveItem(e.Item); return; } if (m_RowsAreaContainer.IsReadyToDrop || m_ColumnsAreaContainer.IsReadyToDrop || m_FilterAreaContainer.IsReadyToDrop || m_DataAreaContainer.IsReadyToDrop) { // Отписываемся от события на удаление. т.к. там мы только меняем стиль текста в узле дерева. А при перетаскивании у нас элемент останется задействованным. container.ItemRemoved -= new EventHandler<AreaItemArgs>(AreaContainer_ItemRemoved); container.RemoveItem(e.Item, false); container.ItemRemoved += new EventHandler<AreaItemArgs>(AreaContainer_ItemRemoved); if (m_RowsAreaContainer.IsReadyToDrop) { m_RowsAreaContainer.AddItem(e.Item); } if (m_ColumnsAreaContainer.IsReadyToDrop) { m_ColumnsAreaContainer.AddItem(e.Item); } if (m_FilterAreaContainer.IsReadyToDrop) { m_FilterAreaContainer.AddItem(e.Item); } if (m_DataAreaContainer.IsReadyToDrop) { m_DataAreaContainer.AddItem(e.Item); } } } } finally { m_RowsAreaContainer.IsReadyToDrop = false; m_ColumnsAreaContainer.IsReadyToDrop = false; m_FilterAreaContainer.IsReadyToDrop = false; m_DataAreaContainer.IsReadyToDrop = false; } }