protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) { base.OnVisualChildrenChanged(visualAdded, visualRemoved); if (visualAdded != null) { FrameworkElement visual = visualAdded as FrameworkElement; Canvas.SetZIndex(visual, _maxZIndex); visual.RenderTransform = new TranslateTransform(); visual.VerticalAlignment = Windows.VerticalAlignment.Top; visual.HorizontalAlignment = Windows.HorizontalAlignment.Left; visual.MouseDown += (s, e) => { double currentZIndex = Canvas.GetZIndex(visual); Canvas.SetZIndex(visual, ++_maxZIndex); _isMouseDownOnChild = true; _mouseClickedChild = visual; _dragMoveStartMargin = visual.Margin; _dragMoveStartedPageIndex = _currentPageIndex; _dragMoveStartPosition = e.GetPosition(null); }; visual.MouseMove += (s, e) => { if (AllowDragMoveChild && _isMouseDownOnChild && e.LeftButton == Input.MouseButtonState.Pressed && s.Equals(_mouseClickedChild)) { Point currentMousePosition = e.GetPosition(null); double diffX = currentMousePosition.X - _dragMoveStartPosition.X; double diffY = currentMousePosition.Y - _dragMoveStartPosition.Y; Thickness tempMargin = _dragMoveStartMargin; tempMargin.Left = _dragMoveStartMargin.Left + diffX; tempMargin.Top = _dragMoveStartMargin.Top + diffY; visual.Margin = tempMargin; double mouseXPostion = e.GetPosition(this).X; if (mouseXPostion < 50) { if (!_isAnimating) { NavigateToPreviousPage(); } } else if (mouseXPostion > this.ActualWidth - 50) { if (!_isAnimating) { NavigateToNextPage(); } } } }; visual.MouseUp += (s, e) => { if (_isMouseDownOnChild && _mouseClickedChild.Equals(visual)) { e.Handled = true; _isMouseDownOnChild = false; int pageIndex = _currentPageIndex; Thickness margin = visual.Margin; margin.Left += (_currentPageIndex - _dragMoveStartedPageIndex) * this.Width; //_dragMovedElements[visual] = margin; visual.Margin = margin; Duration tempDuration = NavigationAnimationDuration; NavigationAnimationDuration = new Duration(TimeSpan.FromSeconds(0)); NavigateToPage(pageIndex, true); NavigationAnimationDuration = tempDuration; } }; } }