首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在WPF中绘制矩形?

如何在WPF中绘制矩形?
EN

Stack Overflow用户
提问于 2011-05-19 22:02:11
回答 7查看 70.6K关注 0票数 19

我需要在画布上画矩形。我知道怎么画画。但我没能做到这一点会画上360度

举例说明。蓝色,淡紫色,绿色,它们是一个相同的矩形,我改变了颜色,例如红点是开始位置的矩形。

编辑:

我的行为:

LeftMouseDown in x=50;y=50 (按) MoveMouse to 100;100 -现在可以将MoveMouse调到30;150或MoveMouse调到10;10 -现在我不能这样做,但我需要它

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-19 22:58:51

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

代码语言:javascript
复制
<Canvas x:Name="canvas" MouseDown="Canvas_MouseDown" MouseMove="Canvas_MouseMove" MouseUp="Canvas_MouseUp" Background="Transparent" />
代码语言:javascript
复制
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;
}
票数 40
EN

Stack Overflow用户

发布于 2011-05-19 22:37:50

步骤:

  1. On MouseLeftButtonDown:如果不旋转:添加一个矩形,其左上角位于鼠标的坐标处,其高度和宽度由上角和鼠标坐标之间的差值计算。将布尔值设置为true以指示您正在绘图。如果正在旋转:通过将旋转布尔值设置为false来停止旋转。
  2. On MouseMove:检查鼠标左键是否仍在按下并且您正在绘图(上一步中的布尔值)。重新计算矩形的宽度和高度。如果正在旋转,请通过计算释放按钮的点、RenderTransformOrigin和鼠标当前位置之间的角度来调整矩形的旋转。(Use Vector.AngleBetween()
  3. On MouseLeftButtonUp:如果绘图为true,则将绘图布尔值设置为false,并将旋转布尔值设置为true。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-05-19 22:50:27

你不需要这样旋转--只需根据鼠标位置调整矩形的高度、宽度和左上角即可。

这对你来说可能是一个很好的起点:

XAML:

代码语言:javascript
复制
<Canvas x:Name="MyCanvas"
        Background="White"
        IsHitTestVisible="True"
        MouseDown="Canvas_MouseDown"
        MouseMove="Canvas_MouseMove"
        MouseUp="Canvas_MouseUp">
</Canvas>

背后的代码:

代码语言:javascript
复制
    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;
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6059894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档