/// <summary> /// Initializes a new instance of the <see cref="DesktopElement"/> class. /// </summary> protected DesktopElement() { this.previewDragOrResizeStatus = DragOrResizeStatus.None; this.dragOrResizeStatus = DragOrResizeStatus.None; this.startMousePosition = new Point(); this.oldCanResize = this.CanResize; }
private DragOrResizeStatus GetDragOrResizeMode(Point position) { DragOrResizeStatus status = DragOrResizeStatus.None; if (this.CanDrag && this.partDragger != null && this.partDragger.IsMouseOver) { status = DragOrResizeStatus.Drag; } else if (this.CanResize) { if (position.X <= ResizeSideThichness) // left { status = this.GetLeftDragStatus(position); } else if (this.ActualWidth - position.X <= ResizeSideThichness) // right { status = this.GetRightDragStatus(position); } else if (position.Y <= ResizeSideThichness) // top { status = this.GetTopDragStatus(position); } else if (this.ActualHeight - position.Y <= ResizeSideThichness) // bottom { status = this.GetBottomDragStatus(position); } } return(status); }
private void CancelDragOrResize() { this.Cursor = null; this.dragOrResizeStatus = DragOrResizeStatus.None; this.previewDragOrResizeStatus = DragOrResizeStatus.None; this.ReleaseMouseCapture(); }
/// <summary> /// Invoked when an unhandled <see cref="E:System.Windows.Input.Mouse.PreviewMouseMove"/> attached event /// reaches an element in its route that is derived from this class. /// Implement this method to add class handling for this event. /// </summary> /// <param name="e">The <see cref="T:System.Windows.Input.MouseEventArgs"/> that contains the event data.</param> protected override void OnPreviewMouseMove(MouseEventArgs e) { if (this.dragOrResizeStatus == DragOrResizeStatus.None) { // http://www.switchonthecode.com/tutorials/wpf-snippet-reliably-getting-the-mouse-position Point point = e.GetPosition(this); this.previewDragOrResizeStatus = this.GetDragOrResizeMode(point); if (!this.CanResize && this.previewDragOrResizeStatus != DragOrResizeStatus.Drag && this.previewDragOrResizeStatus != DragOrResizeStatus.None) { this.previewDragOrResizeStatus = DragOrResizeStatus.None; } this.SetResizeCursor(this.previewDragOrResizeStatus); } else if (this.IsMouseCaptured) { if (e.MouseDevice.LeftButton == MouseButtonState.Pressed) { // http://www.switchonthecode.com/tutorials/wpf-snippet-reliably-getting-the-mouse-position Point point = e.GetPosition(this); if (Math.Abs(point.X - this.previousMousePosition.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(point.Y - this.previousMousePosition.Y) > SystemParameters.MinimumVerticalDragDistance) { e.Handled = true; this.AdjustBounds(point); this.previousMousePosition = point; } } else { this.CancelDragOrResize(); } } else { this.CancelDragOrResize(); } base.OnPreviewMouseMove(e); }
/// <summary> /// Invoked when an unhandled <see cref="E:System.Windows.UIElement.PreviewMouseLeftButtonDown"/> routed event /// reaches an element in its route that is derived from this class. /// Implement this method to add class handling for this event. /// </summary> /// <param name="e"> /// The <see cref="T:System.Windows.Input.MouseButtonEventArgs"/> that contains the event data. /// The event data reports that the left mouse button was pressed. /// </param> protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) { if (!e.Handled && e.ClickCount == 1 && e.Source == this) { if (this.dragOrResizeStatus == DragOrResizeStatus.None && this.previewDragOrResizeStatus != DragOrResizeStatus.None) { e.Handled = true; this.dragOrResizeStatus = this.previewDragOrResizeStatus; this.startMousePosition = this.previousMousePosition = e.GetPosition(this); this.CaptureMouse(); } } base.OnPreviewMouseLeftButtonDown(e); }
private void SetResizeCursor(DragOrResizeStatus resizeStatus) { if (this.CanResize || this.CanDrag) { if (resizeStatus.IsDragging) { this.Cursor = null; } else if (resizeStatus.IsOnTopLeftOrBottomRight) { this.Cursor = Cursors.SizeNWSE; } else if (resizeStatus.IsOnTopRightOrBottomLeft) { this.Cursor = Cursors.SizeNESW; } else if (resizeStatus.IsOnTopRightOrBottomLeft) { this.Cursor = Cursors.SizeNESW; } else if (resizeStatus.IsOnTopCenterOrBottomCenter) { this.Cursor = Cursors.SizeNS; } else if (resizeStatus.IsOnMiddleLeftOrMiddleRight) { this.Cursor = Cursors.SizeWE; } else if (this.Cursor != null) { this.Cursor = null; } } else if (this.Cursor != null) { this.Cursor = null; } }
/// <summary> /// Closes the desktop element /// </summary> public virtual void Close() { if (this.Parent != null) { this.Parent.Children.Remove(this); } // Clean up this.Id = Guid.Empty; this.previewDragOrResizeStatus = DragOrResizeStatus.None; this.dragOrResizeStatus = DragOrResizeStatus.None; this.startMousePosition = new Point(); this.previousMousePosition = new Point(); this.oldPosition = new Point(); this.previousSize = Size.Empty; this.originalSize = Size.Empty; this.isInitialized = false; this.oldCanResize = false; this.partDragger = null; this.parent = null; this.Content = null; this.DataContext = null; }