private static void self_MouseDown(object sender, MouseButtonEventArgs e) { FrameworkElement self = (FrameworkElement)sender; ResizeWay resizable = (ResizeWay)self.GetValue(ResizableWayProperty); if (resizable == ResizeWay.None) { return; } bool captured = self.CaptureMouse(); if (captured) { Point lastPosition = self.PointToScreen(e.GetPosition(self)); self.SetValue(CapturedProperty, true); self.SetValue(LastPositionProperty, lastPosition); e.Handled = true; } }
public static void SetResizeWay(DependencyObject d, ResizeWay value) { d.SetValue(ResizeWayProperty, value); }
private static void self_MouseMove(object sender, MouseEventArgs e) { try { FrameworkElement self = (FrameworkElement)sender; double minHeight = (double)self.GetValue(MinHeightProperty); double minWidth = (double)self.GetValue(MinWidthProperty); //Debug.WriteLine(string.Format("self_MouseMove minHeight:{0}; minWidth:{1}", minHeight, minWidth)); bool captured = (bool)self.GetValue(CapturedProperty); if (captured) { var position = self.PointToScreen(e.GetPosition(self)); ResizeWay resizableWay = (ResizeWay)self.GetValue(ResizableWayProperty); Point lastPosition = (Point)self.GetValue(LastPositionProperty); var offsetX = position.X - lastPosition.X; if ((resizableWay & ResizeWay.Left) == ResizeWay.Left) { offsetX = Math.Min(offsetX, self.ActualWidth - minWidth); self.Width -= offsetX; Window window = self as Window; if (window != null) { window.Left += offsetX; } } else if ((resizableWay & ResizeWay.Right) == ResizeWay.Right) { offsetX = Math.Max(offsetX, minWidth - self.ActualWidth); self.Width += offsetX; } var offsetY = position.Y - lastPosition.Y; if ((resizableWay & ResizeWay.Top) == ResizeWay.Top) { offsetY = Math.Min(offsetY, self.ActualHeight - minHeight); self.Height -= offsetY; Window window = self as Window; if (window != null) { window.Top += offsetY; } } else if ((resizableWay & ResizeWay.Bottom) == ResizeWay.Bottom) { offsetY = Math.Max(offsetY, minHeight - self.ActualHeight); self.Height += offsetY; } lastPosition = position; self.SetValue(LastPositionProperty, lastPosition); e.Handled = true; } else { ResizeWay resizeWay = GetResizeWay(self); ResizeWay resizableWay = ResizeWay.None; var position = e.GetPosition(self); if (position.Y < THRESHOLD) { resizableWay |= ResizeWay.Top; } else if (position.Y > self.ActualHeight - THRESHOLD && position.Y < self.ActualHeight - 1) { resizableWay |= ResizeWay.Bottom; } if (position.X < THRESHOLD) { resizableWay |= ResizeWay.Left; } else if (position.X > self.ActualWidth - THRESHOLD && position.X < self.ActualWidth - 1) { resizableWay |= ResizeWay.Right; } resizableWay &= resizeWay; self.SetValue(ResizableWayProperty, resizableWay); if (resizableWay != ResizeWay.None) { if ((resizableWay & ResizeWay.Left) == ResizeWay.Left) { if ((resizableWay & ResizeWay.Top) == ResizeWay.Top) { self.Cursor = Cursors.SizeNWSE; } else if ((resizableWay & ResizeWay.Bottom) == ResizeWay.Bottom) { self.Cursor = Cursors.SizeNESW; } else { self.Cursor = Cursors.SizeWE; } } else if ((resizableWay & ResizeWay.Right) == ResizeWay.Right) { if ((resizableWay & ResizeWay.Top) == ResizeWay.Top) { self.Cursor = Cursors.SizeNESW; } else if ((resizableWay & ResizeWay.Bottom) == ResizeWay.Bottom) { self.Cursor = Cursors.SizeNWSE; } else { self.Cursor = Cursors.SizeWE; } } else if ((resizableWay & ResizeWay.Top) == ResizeWay.Top) { self.Cursor = Cursors.SizeNS; } else if ((resizableWay & ResizeWay.Bottom) == ResizeWay.Bottom) { self.Cursor = Cursors.SizeNS; } e.Handled = true; } else { self.Cursor = Cursors.Arrow; } } } catch (Exception ex) { Debug.WriteLine("self_MouseMove exception:" + ex.Message); } }