专栏首页林德熙的博客WPF 在image控件用鼠标拖拽出矩形

WPF 在image控件用鼠标拖拽出矩形

今天有小伙伴问我一个问题,在image控件用鼠标拖拽出矩形,本文告诉大家如何使用鼠标画出矩形

做出来的效果先请大家看一下

最简单的方法是在 Down 的时候记录按下的点,在 移动的时候重新计算所在的宽度

先在界面使用一个图片和一个矩形

    <Grid x:Name="Grid">
        <Image Source="TIM截图20180811150831.png"></Image>
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">欢迎访问我博客 http://lindexi.oschina.io </TextBlock>
        <Rectangle x:Name="Rectangle" StrokeThickness="2" Stroke="Black" HorizontalAlignment="Left" VerticalAlignment="Top"></Rectangle>
    </Grid>

需要注意,图片的位置需要修改为自己需要的图片

这里的 Rectangle 需要做一些设置,主要 HorizontalAlignmentVerticalAlignment 必须设置为左上角

现在打开 cs 代码,在按下和移动修改矩形

            MouseDown += MainWindow_MouseDown;
            MouseMove += MainWindow_MouseMove;
            MouseUp += MainWindow_MouseUp;

需要两个字段来记录当前是否按下和第一次按下所在的坐标

刚才给 Grid 的命名就是为了拿到相对 Grid 的坐标

        private void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
        {
            _started = true;

            _downPoint = e.GetPosition(Grid);
        }

        private bool _started;

        private Point _downPoint;

在鼠标按下时拿到按下的坐标,通过这个坐标就可以计算出矩形所在的位置

        private void MainWindow_MouseUp(object sender, MouseButtonEventArgs e)
        {
            _started = false;
        }

        private void MainWindow_MouseMove(object sender, MouseEventArgs e)
        {
            if (_started)
            {
                var point = e.GetPosition(Grid);

                var rect = new Rect(_downPoint, point);
                Rectangle.Margin = new Thickness(rect.Left, rect.Top, 0, 0);
                Rectangle.Width = rect.Width;
                Rectangle.Height = rect.Height;
            }
        }

代码就是这么简单,通过修改 Margin 的方法修改矩形

如果对于高手,我建议使用 RenderTransform 的方式而不是使用 Margin 这里使用这个方法只是看起来简单

因为性能最差 Canvas.SetLeft Canvas.SetTop,性能中等 Margin,性能最好 RenderTransform 当然使用 RenderTransform 的方法没有使用 Margin 那样容易了解


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VisualStudio 使用三个方法启动最新 C# 功能 第一个方法第二个方法第三个方法

    本文告诉大家如何在 VisualStudio 打开最新的 C#,现在的微软更新 C# 很快,那么如何让 VisualStudio 在项目使用最新的

    林德熙
  • 如何在 Windows 10 中移除 Internet Explorer 浏览器 如何通过控制面板删除 Internet Explorer 浏览器通过 PowerShell 删

    现在 Internet Explorer (IE)已经过时了,可以通过控制面板移除这个古老但是依然是一个伟大的浏览器

    林德熙
  • WPF 如何在应用程序调试启动

    如果在一些无法使用源代码编译的电脑,调试一个exe无法启动,那么需要使用本文的技术。

    林德熙
  • 聊聊springboot jest autoconfigure

    spring-boot-autoconfigure-2.1.4.RELEASE-sources.jar!/org/springframework/boot/au...

    codecraft
  • HTML5 性能监控API - timing API

    HTML5 的 performance timing API 统计了一个浏览器窗口从卸载当前页面开始到加载完毕目标页面的整个流程中,每个节点的时间戳 通过这些...

    dys
  • 重叠网络——什么让我们等了这么长时间?

    虚拟化大获成功,是因为它实现了最初承诺的优势,包括优化硬件利用率,减少服务器泛滥和最大限度增加服务器硬件投资回报。这是通过以下途径实现的:对服务器的计算资源(C...

    静一
  • PhpStorm提示interpreter is not configured解决方法

    返回PhpStorm软件,右下角提示"interpreter is not configured Please configure PHP Interprete...

    德顺
  • Java中 private、protected、public 和 default 的区别

    具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。

    萬物並作吾以觀復
  • Java中的private、protected、public和default的区别(详解)

    (1)对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口...

    sr
  • Java的访问控制符详解(结合代码演示)

    Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节是需要暴露的。Java中四种“访问控制符”说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权...

    bboy枫亭

扫码关注云+社区

领取腾讯云代金券