当前位置: 首页 > 知识库问答 >
问题:

WPF-如何在鼠标点击时独立于分辨率和大小调整获得画布位置

容鸿畴
2023-03-14

我在超文本标记语言5 JavaScript上找到了很多关于这个主题的东西(像这样),但是我在WPF上什么也没找到。

我有一个我们正在创建的画布,用于在画布中的图像上选择点。

XAML中的canvas元素非常简单:

        <Canvas x:Name="Cnv" Grid.Column="1" Grid.Row="1" />

我们从鼠标点击中获取坐标,如下所示:

        Point p = Mouse.GetPosition(Cnv);

然后,我们在这一点上画一些东西:

        ellipse = new Ellipse();
        ellipse.Fill = Brushes.Transparent;
        ellipse.Width = 20;
        ellipse.Height = 20;
        ellipse.Stroke = Brushes.Gray;
        ellipse.StrokeThickness = 1;

        Cnv.Children.Add(ellipse);
        Canvas.SetLeft(ellipse, p.X-9);
        Canvas.SetTop(ellipse, p.Y-5);

这里的问题是,如果用户调整屏幕大小,画布也会调整大小。当然,坐标不再正确。

有没有办法在与画布更“相对”的位置绘制这个椭圆?考虑到这些点,我如何正确调整画布的大小?有事件处理程序吗?

共有1个答案

李鸿
2023-03-14

您可以使用Viewbox,并注意图像大小是其源位图的本机像素大小。

<Viewbox>
    <Grid>
        <Image Source="..."
               Width="{Binding Source.PixelWidth, RelativeSource={RelativeSource Self}}"
               Height="{Binding Source.PixelHeight, RelativeSource={RelativeSource Self}}"
               MouseDown="ImageMouseDown"/>
        <Canvas x:Name="canvas"/>
    </Grid>
</Viewbox>

无论缩放比例如何,鼠标事件处理程序都会在单击位置放置一个椭圆,并且单击位置(和椭圆大小)以位图像素坐标表示:

private void ImageMouseDown(object sender, MouseButtonEventArgs e)
{
    var pos = e.GetPosition((IInputElement)sender);

    var ellipse = new Ellipse
    {
        Width = 20,
        Height = 20,
        Fill = Brushes.Magenta
    };

    Canvas.SetLeft(ellipse, pos.X - 10);
    Canvas.SetTop(ellipse, pos.Y - 10);
    canvas.Children.Add(ellipse);
}
 类似资料:
  • 本文向大家介绍html5-canvas 画布大小和分辨率,包括了html5-canvas 画布大小和分辨率的使用技巧和注意事项,需要的朋友参考一下 示例 画布的大小是它在页面上占据的区域,由CSS width和height属性定义。 画布分辨率定义了它包含的像素数。通过设置画布元素的width和height属性来设置分辨率。如果未指定,则画布默认为300 x 150像素。 下面画布将使用上述CSS

  • 为了更好的提升微页面在移动端的阅读体验,对于微页面图片上传做了以下限制: 图片大小最大2M 图片分辨率最大1080px; 在遇到设计师给出超大分辨率的高清图片时,可通过 1、在系统文件夹内找到需要调整的图片,右键选择【编辑】,进入画图编辑图片; 2、在画图左上区域找到【重新调整大小】并点击,在弹出窗口【调整大小和扭曲】中选择重新调整大小依据为“像素”,勾选“保持纵横比”,在水平输入框中输入750(

  • 现在我有一个应用程序,可以让用户单击按钮浏览用作画布背景的图片。我想这样做,如果用户单击画布上的某个地方,则在该点放置一个节点。我假设我需要获取鼠标坐标。有没有一个简单的方法可以调用将节点放置在鼠标单击位置,或者我必须在这个链接中选择路线:WPF-使用鼠标事件在画布上绘图?提前谢谢。 编辑:添加了我尝试制作椭圆的代码。不过它不起作用,而且我不确定如何使用鼠标点击椭圆的坐标。我知道对于一行来说,它只

  • 问题内容: 将click事件处理程序添加到canvas元素(将返回click的x和y坐标)(相对于canvas元素)的最简单方法是什么? 不需要旧版浏览器兼容性,Safari,Opera和Firefox都可以。 问题答案: 这个答案很老了,它使用检查不再需要的旧浏览器,因为和属性在所有当前浏览器中都有效。您可能想查看PatriquesAnswer,以获得更简单,最新的解决方案。 最初的答案: 正如

  • 一直以来,我都在开发一款分辨率为800x480(流行手机分辨率)的应用程序。 我的画布HTML: 现在,为了使其全屏显示其他分辨率,我在调整大小事件后执行以下操作: 这是可行的,但问题是我不能以这种方式保持纵横比。800x480是4:3,但是如果我在5:3的手机上运行这个应用程序,有些东西(尤其是圆圈)看起来会被拉伸。 有没有什么方法可以让它在所有分辨率下看起来都很好,而不必为每个纵横比创建一组独