public void AddDragHandler(UIElement canvas) { MouseButtonEventHandler startDragging = null; startDragging = (object sender, MouseButtonEventArgs downEvent) => { if (downEvent.ChangedButton != MouseButton.Middle) { downEvent.Handled = false; return; } downEvent.Handled = true; canvas.CaptureMouse(); var dragStartPos = PointConversions.CanvasFromMouse(downEvent.MouseDevice, canvas); var originStartPos = _origin.Point; MouseEventHandler MiddleDragListener = (object o, MouseEventArgs moveEvent) => { var mouse_pos = PointConversions.CanvasFromMouse(moveEvent.MouseDevice, canvas); _origin.Point = new CanvasPosition { X = originStartPos.X + (mouse_pos.X - dragStartPos.X), Y = originStartPos.Y + (mouse_pos.Y - dragStartPos.Y), }; }; MouseButtonEventHandler mouseUpListener = null; mouseUpListener = (object bob, MouseButtonEventArgs upEvent) => { if (upEvent.ChangedButton != MouseButton.Middle) { upEvent.Handled = false; return; } canvas.ReleaseMouseCapture(); upEvent.Handled = true; canvas.MouseMove -= MiddleDragListener; canvas.MouseUp -= mouseUpListener; canvas.MouseDown += startDragging; }; canvas.MouseMove += MiddleDragListener; canvas.MouseUp += mouseUpListener; canvas.MouseDown -= startDragging; }; canvas.MouseDown += startDragging; }
public void DoDragDrop(IDataObject dataObject, UIElement dragSource, bool showDragVisual, bool useVisualBrush, DragDropEffects effects) { if (!IsDragging) { _useDefaultCursor = true; _dragScope = Application.Current.MainWindow.Content as FrameworkElement; bool previousDrop = _dragScope.AllowDrop; _dragScope.AllowDrop = true; _dragScope.PreviewDragOver += DragScope_PreviewDragOver; _dragScope.DragOver += DragScope_DragOver; _dragScope.DragLeave += DragScope_DragLeave; _dragScope.DragEnter += DragScope_DragEnter; _dragScope.GiveFeedback += DragSource_GiveFeedback; _dragScope.QueryContinueDrag += DragScope_QueryContinueDrag; var _layer = AdornerLayer.GetAdornerLayer(_dragScope); if (showDragVisual) { _dragAdorner = new DragAdorner(_dragScope, dragSource, useVisualBrush); _layer.Add(_dragAdorner); } IsDragging = true; _dragHasLeftScope = false; dragSource.CaptureMouse(); DragDropEffects de = System.Windows.DragDrop.DoDragDrop(dragSource, dataObject, effects); dragSource.ReleaseMouseCapture(); if (_dragAdorner != null) { _layer.Remove(_dragAdorner); _dragAdorner = null; } _dragScope.AllowDrop = previousDrop; _dragScope.GiveFeedback -= DragSource_GiveFeedback; _dragScope.DragLeave -= DragScope_DragLeave; _dragScope.DragLeave -= DragScope_DragEnter; _dragScope.QueryContinueDrag -= DragScope_QueryContinueDrag; _dragScope.DragOver -= DragScope_DragOver; _dragScope.PreviewDragOver -= DragScope_PreviewDragOver; IsDragging = false; } }
public PageFlipper(Size pageSize, UIElement hotCorner, UIElement pageHolder, FrameworkElement curlShadow, FrameworkElement dropShadow) { Contract.Requires(pageSize.IsValid()); m_pageSize = pageSize; m_hotCorner = hotCorner; m_curlShadow = curlShadow; m_dropShadow = dropShadow; // can be null m_pageHolder = pageHolder; #region helper values m_pageHalfHeight = m_pageSize.Height * .5; m_origin = new Point(m_pageSize.Width, m_pageSize.Height / 2.0); m_pageDiagonal = Math.Sqrt(m_pageSize.Width * m_pageSize.Width + m_pageSize.Height * m_pageSize.Height); m_pointLeft = new Point(-m_pageSize.Width, m_pageHalfHeight); m_pointRight = new Point(m_pageSize.Width, m_pageHalfHeight); #endregion #region clips and transforms m_pageTransformGroup = new TransformGroup(); m_pageTransformGroup.Children.Add(new TranslateTransform() { Y = -m_pageSize.Height }); m_pageTransformGroup.Children.Add(m_pageRotateTransform = new RotateTransform()); m_pageTransformGroup.Children.Add(m_pageTranslateTransform = new TranslateTransform()); m_pageHolderClip = new RectangleGeometry() { Rect = new Rect(0, 0, m_pageSize.Width, m_pageSize.Height * 2) }; m_nextPageClip = new RectangleGeometry() { Rect = new Rect(0, 0, m_pageSize.Width * 2, m_pageSize.Height * 2) }; if (m_curlShadow != null) { var group = new TransformGroup(); group.Children.Add(m_curlShadowRotate = new RotateTransform()); group.Children.Add(m_curlShadowTranslate = new TranslateTransform()); m_curlShadow.RenderTransform = group; m_curlShadow.Height = m_pageDiagonal * 1.5; m_curlShadowRotate.CenterX = m_curlShadow.Width; m_curlShadowRotate.CenterY = m_pageDiagonal; m_curlShadowTranslate.Y = m_pageSize.Height - m_pageDiagonal; } if (m_dropShadow != null) { //m_dropShadowBlurEffect = new BlurEffect() { Radius = 20 }; //m_dropShadow.Effect = m_dropShadowBlurEffect; m_dropShadow.RenderTransform = m_pageTransformGroup; m_dropShadow.Width = m_pageSize.Width; m_dropShadow.Height = m_pageSize.Height; } #endregion // MOST OF THE LOADED FUNCTION IS USED TO SET LOOK UP VALUES // BASED ON THE pageWidth AND pageHeight INITIALLY DEFINED. // POSITION THE PAGE AND SPINE VISUALS ACCORDINGLY m_mouse.X = m_pageSize.Width - 1; m_mouse.Y = m_pageHalfHeight - 1; m_follow = m_mouse; #region mouse handlers if (m_hotCorner != null && m_pageHolder != null) { m_hotCorner.MouseMove += (sender, e) => { m_animating = false; m_listener.StartListening(); Point testBounds = (Point)e.GetPosition(m_pageHolder).Subtract(m_origin); if (testBounds.X > m_pageSize.Width && testBounds.Y > m_pageHalfHeight) { m_mouse = m_pointRight; } else { m_mouse = testBounds; } }; m_hotCorner.MouseLeftButtonDown += (sender, e) => { m_hotCorner.CaptureMouse(); }; m_hotCorner.MouseLeftButtonUp += (sender, e) => { m_listener.StartListening(); m_hotCorner.ReleaseMouseCapture(); m_mouse = (m_mouse.X < 0) ? m_pointLeft : m_pointRight; }; m_hotCorner.MouseLeave += (sender, e) => { m_listener.StartListening(); m_mouse = m_pointRight; }; } #endregion m_listener.Rendering += (sender, args) => updateUI(); m_listener.IsListeningChanged += (sender, args) => { var handler = IsAnimatingChanged; if (handler != null) { handler(this, EventArgs.Empty); } }; }
/// <summary> /// Handler for the event when the user stops dragging the dragElement and releases it. /// </summary> /// <param name="child">UIElement being dragged</param> /// <param name="position">Position where the user clicked w.r.t. the UIElement being dragged</param> /// <param name="positionInParent">Position where the user clicked w.r.t. the FluidWrapPanel (the parentFWPanel of the UIElement being dragged</param> internal void EndFluidDrag(UIElement child, Point position, Point positionInParent) { if ((child == null) || (!IsComposing)) return; // Call the event handler core on the Dispatcher. (Improves efficiency!) Dispatcher.BeginInvoke(new Action(() => { if ((dragElement != null) && (layoutManager != null)) { dragElement.RenderTransform = layoutManager.CreateTransform(positionInParent.X - dragStartPoint.X, positionInParent.Y - dragStartPoint.Y, DragScale, DragScale); child.Opacity = NORMAL_OPACITY; // Z-Index is set to 1 so that during the animation it does not go below other elements. child.SetValue(Canvas.ZIndexProperty, Z_INDEX_INTERMEDIATE); // Release the mouse capture child.ReleaseMouseCapture(); // Reference used to set the Z-Index to 0 during the UpdateFluidLayout lastDragElement = dragElement; dragElement = null; } UpdateFluidLayout(); })); }
public static void MouseUp(MouseButtonEventArgs e, UIElement element, IControlMouseInteraction control) { var location = e.GetPosition(element); var keysHeld = GetKeysHeld(); float x = (float)location.X; float y = (float)location.Y; element.ReleaseMouseCapture(); switch (e.ChangedButton) { case MouseButton.Left: control.MouseUp(x, y, MouseButtonType.Left, keysHeld); break; case MouseButton.Middle: control.MouseUp(x, y, MouseButtonType.Middle, keysHeld); break; case MouseButton.Right: control.MouseUp(x, y, MouseButtonType.Right, keysHeld); break; } }
/// <summary> /// Handler for the event when the user stops dragging the dragElement and releases it. /// </summary> /// <param name="child">UIElement being dragged</param> /// <param name="position">Position where the user clicked w.r.t. the UIElement being dragged</param> /// <param name="positionInParent">Position where the user clicked w.r.t. the FluidWrapPanel (the parentFWPanel of the UIElement being dragged</param> internal async Task EndFluidDragAsync(UIElement child, Point position, Point positionInParent) { if ((child == null) || (!IsComposing) || (_dragElement == null)) return; // Call the event handler core on the Dispatcher. (Improves efficiency!) await Dispatcher.InvokeAsync(() => { _dragElement.RenderTransform = CreateTransform(positionInParent.X - _dragStartPoint.X, positionInParent.Y - _dragStartPoint.Y, DragScale, DragScale); child.Opacity = NORMAL_OPACITY; // Z-Index is set to 1 so that during the animation it does not go below other elements. child.SetValue(ZIndexProperty, Z_INDEX_INTERMEDIATE); // Release the mouse capture child.ReleaseMouseCapture(); // Reference used to set the Z-Index to 0 during the UpdateFluidLayout _lastDragElement = _dragElement; _dragElement = null; _lastExchangeElement = null; InvalidateVisual(); }); }