【问题标题】:WPF Different behaviour when drawing point versus lineWPF 绘制点与线时的不同行为
【发布时间】:2019-11-27 12:33:52
【问题描述】:

当滚轮移动时,我正在尝试从画布上的图像中心到鼠标位置绘制一条线。

我有一个看起来像这样的函数:

// e is MouseWheelEventArgs
var position = e.GetPosition(canvas);
var x = Canvas.GetLeft(image) + image.ActualWidth / 2;
var y = Canvas.GetTop(image) + image.ActualHeight / 2;

Ellipse point = new Ellipse
{
    Margin = new Thickness(x, y, 0, 0)
};

Line line = new Line
{
    X1 = position.X,
    Y1 = position.Y,
    X2 = x,
    Y2 = y
};

canvas.Children.Add(point);
canvas.Children.Add(line);

点在指针的位置正确绘制,线是从图像中心绘制的,但线绘制到的点不正确。这是为什么呢?

这是显示点和线位置的图像

【问题讨论】:

  • 不要使用边距来定位画布中的元素。请改用 SetLeft 和 SetTop。为了绘制一个中心圆,要么将 Ellipse's Margin 设置为其半径的负数,要么使用带有 EllipseGeometry 的 Path。

标签: c# wpf canvas shapes


【解决方案1】:

我建议用几何来实现它。

使用这样的 XAML

<Canvas Background="Transparent" MouseWheel="Canvas_MouseWheel">
    <Image x:Name="image" Canvas.Left="0" Canvas.Top="0" Source="..."/>
    <Path x:Name="line" Stroke="Green" StrokeThickness="2"/>
    <Path x:Name="point" Fill="Red"/>
</Canvas>

事件处理程序可能如下所示:

private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
    var position = e.GetPosition((Canvas)sender);

    var center = new Point(
        Canvas.GetLeft(image) + image.ActualWidth / 2,
        Canvas.GetTop(image) + image.ActualHeight / 2);

    line.Data = new LineGeometry(center, position);
    point.Data = new EllipseGeometry(position, 3, 3);
}

【讨论】:

  • 感谢您的建议,我试了一下。不幸的是,它把线的两个点都放在了不正确的位置。
  • 在哪种意义上不正确?不确定您在此示例中还添加了什么。此处显示的代码将一个线端点定位在图像中心,另一个定位在鼠标位置。
  • 我的错,我有一些指令顺序错误,鼠标所在的线点绘制正确,但中心不在中心。
  • 可能你的图片被拉伸了。不知道。它是 Canvas 的直系子代吗?你设置它的宽度还是高度?这符合它的纵横比吗?
  • 它使用矩阵进行转换。我最终改用了网格的中心
猜你喜欢
  • 2022-12-04
  • 1970-01-01
  • 2013-04-06
  • 2016-05-26
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多