如何在WPF中绘制矩形?

我需要在canvas上绘制矩形。 我知道怎么画。 但我没有这样做会画360度

例。 蓝色,淡紫色,绿色它们是同一个矩形,我改变颜色例如红点是起始位置矩形。

在此处输入图像描述

编辑:

我的行动:

LeftMouseDown在x = 50; y = 50(按)MoveMouse到100; 100 – 现在它将MoveMouse工作到30; 150或MoveMouse到10; 10 – 现在我不能这样做,但我需要它

除非你需要一个旋转的矩形,否则我不会费心使用变换。 只需将Left和Top设置为最小x和y,将宽度设置为max-x和height maxy-y。

 
 private Point startPoint; private Rectangle rect; private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) { startPoint = e.GetPosition(canvas); rect = new Rectangle { Stroke = Brushes.LightBlue, StrokeThickness = 2 }; Canvas.SetLeft(rect,startPoint.X); Canvas.SetTop(rect,startPoint.Y); canvas.Children.Add(rect); } private void Canvas_MouseMove(object sender, MouseEventArgs e) { if(e.LeftButton == MouseButtonState.Released || rect == null) return; var pos = e.GetPosition(canvas); var x = Math.Min(pos.X, startPoint.X); var y = Math.Min(pos.Y, startPoint.Y); var w = Math.Max(pos.X, startPoint.X) - x; var h = Math.Max(pos.Y, startPoint.Y) - y; rect.Width = w; rect.Height = h; Canvas.SetLeft(rect, x); Canvas.SetTop(rect, y); } private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) { rect = null; } 

脚步:

  1. 在MouseLeftButtonDown上:如果不旋转:在鼠标坐标处添加一个左上角的矩形,并通过顶角和鼠标坐标之间的差异计算其高度和宽度。 将布尔值设置为true以指示您正在绘制。 如果您正在旋转:通过将旋转布尔值设置为false来停止旋转。

  2. 在MouseMove上:检查鼠标左键是否仍然按下并且您正在绘制(上一步中的布尔值)。 重新计算矩形的宽度和高度。 如果要旋转,则通过计算释放按钮的点,RenderTransformOrigin和鼠标的当前位置之间的角度来调整矩形的旋转。 (使用Vector.AngleBetween()

  3. 在MouseLeftButtonUp上:如果绘图为true,则将绘图布尔值设置为false,并将旋转布尔值设置为true。

此流程允许您单击(设置矩形的一角),拖动和释放以设置对角,移动鼠标以旋转矩形,然后单击以固定矩形。

使用RenderTransform放置并旋转矩形:这将比在矩形上设置边距或Canvas.Left更容易。

如果您需要帮助,请告诉我。

您根本不需要像这样旋转 – 只需根据鼠标位置调整矩形的高度,宽度和左上角。

这可能是一个很好的起点:

XAML:

   

代码背后:

  private bool _mouseDown = false; private Rectangle _current; private Point _initialPoint; private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) { _mouseDown = (e.ButtonState == MouseButtonState.Pressed) && (e.ChangedButton == MouseButton.Left); if (!_mouseDown) return; _current = new Rectangle(); _initialPoint = e.MouseDevice.GetPosition(MyCanvas); _current.Fill = new SolidColorBrush(Colors.Blue); MyCanvas.Children.Add(_current); } private void Canvas_MouseMove(object sender, MouseEventArgs e) { if (!_mouseDown) return; Point position = e.MouseDevice.GetPosition(MyCanvas); _current.SetValue(Canvas.LeftProperty, Math.Min(position.X, _initialPoint.X)); _current.SetValue(Canvas.TopProperty, Math.Min(position.Y, _initialPoint.Y)); _current.Width = Math.Abs(position.X - _initialPoint.X); _current.Height = Math.Abs(position.Y - _initialPoint.Y); } private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Left) _mouseDown = false; } 
 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace SilverlightApplication1 { public partial class MainPage : UserControl { public MainPage() { // Required to initialize variables InitializeComponent(); mainCanvas.MouseLeftButtonDown+=new System.Windows.Input.MouseButtonEventHandler(MainPage_MouseLeftButtonDown); mainCanvas.MouseLeftButtonUp+=new System.Windows.Input.MouseButtonEventHandler(MainPage_MouseLeftButtonUp); mainCanvas.MouseMove+=new System.Windows.Input.MouseEventHandler(MainPage_MouseMove); SolidColorBrush myBrush = new SolidColorBrush(Colors.Green); _curRectangle.Rect.Stroke = myBrush; _curRectangle.Rect.StrokeThickness = 4; _curRectangle.Rect.Fill = myBrush; } private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { // TODO: Add event handler implementation here. } private void elipse_Click(object sender, System.Windows.RoutedEventArgs e) { // TODO: Add event handler implementation here. } RealRect _curRectangle = null; private void MainPage_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { _curRectangle = new RealRect((int)e.GetPosition(sender as Canvas).X, (int)e.GetPosition(sender as Canvas).Y, false); mainCanvas.Children.Insert(0, _curRectangle.Rect); _curRectangle.StartRect(); } private void MainPage_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { if (_curRectangle != null) { _curRectangle.ClearStartTemp(); _curRectangle = null; } } private void MainPage_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { if (_curRectangle != null) { _curRectangle.EndX = (int)e.GetPosition(sender as Canvas).X; _curRectangle.EndY = (int)e.GetPosition(sender as Canvas).Y; _curRectangle.MakeReal(); } //exampleRectangle.Rect.Width = - Canvas.GetLeft(exampleRectangle.Rect); //exampleRectangle.Rect.Height = - Canvas.GetTop(exampleRectangle.Rect); } } } 

工人阶级

 using System.Windows.Shapes; using System.Windows.Controls; using System.Windows; namespace SilverlightApplication1 { public struct Point { public static readonly Point Empty; public Point(int x, int y) { _x = x; _y = y; } int _x; public int X { get { return _x; } set { _x = value; } } int _y; public int Y { get { return _y; } set { _y = value; } } } public class RealRect { Rectangle mRect = new Rectangle(); #region Class Local Variables private SilverlightApplication1.Point mStart; public SilverlightApplication1.Point MStart { get { return mStart; } set { mStart = value; } } private SilverlightApplication1.Point mEnd; private SilverlightApplication1.Point mRealStart; private SilverlightApplication1.Point mRealEnd; private System.Windows.Size mRealSize; private bool isStatus = false; public bool IsStatus { get { return isStatus; } set { isStatus = value; } } private SilverlightApplication1.Point mTempPoint; #endregion public RealRect(int x, int y, bool start) { mTempPoint = new SilverlightApplication1.Point(x, y); IsStatus = false; mEnd = Point.Empty; mRealEnd = Point.Empty; } public void ClearStartTemp() { IsStatus = false; mTempPoint = Point.Empty; } public void StartRect() { IsStatus = true; mStart = mTempPoint; mRealStart = mTempPoint; } ///  /// Ending X Value of rectangle ///  public int EndX { set { mEnd.X = value; } } ///  /// Ending Y Value of rectangle ///  public int EndY { set { mEnd.Y = value; } } ///  /// Get the corrected rectangle ///  public Rectangle Rect { get { MakeReal(); return mRect; } } public void MakeReal() { //Started top left, ended bottom right if (mEnd.X > mStart.X && mEnd.Y > mStart.Y) { mRealStart = mStart; mRealEnd = mEnd; mRealSize = new Size(mRealEnd.X - mRealStart.X, mRealEnd.Y - mRealStart.Y); // return; } //Started bottom right, ended top left else if (mEnd.X < mStart.X && mEnd.Y < mStart.Y) { mRealEnd = mStart; mRealStart = mEnd; mRealSize = new Size(mRealEnd.X - mRealStart.X, mRealEnd.Y - mRealStart.Y); // return; } //Started top right left, ended bottom left else if (mEnd.X < mStart.X && mEnd.Y > mStart.Y) { mRealStart.X = mEnd.X; mRealStart.Y = mStart.Y; mRealEnd.X = mStart.X; mRealEnd.Y = mEnd.Y; mRealSize = new Size(mRealEnd.X - mRealStart.X, mRealEnd.Y - mRealStart.Y); // return; } //Started bottom left, ended top right else if (mEnd.X > mStart.X && mEnd.Y < mStart.Y) { mRealStart.X = mStart.X; mRealStart.Y = mEnd.Y; mRealEnd.X = mEnd.X; mRealEnd.Y = mStart.Y; mRealSize = new Size(mRealEnd.X - mRealStart.X, mRealEnd.Y - mRealStart.Y); // return; } Canvas.SetLeft(mRect, mRealStart.X); Canvas.SetTop(mRect, mRealStart.Y); mRect.Width = mRealSize.Width; mRect.Height = mRealSize.Height; } } } 

也许我错了,但我认为这可行: