关闭

WPF鼠标划线测距——模仿电子地图测距

标签: WPFmouseMove mouseClick图片处理canvas界面
899人阅读 评论(0) 收藏 举报
分类:

百度地图的测距工具,大家用过的应该知道。

选择进入测距模式,单击鼠标选择起始点。移动鼠标,出现随鼠标移动的直线,再单击,又可以选中一点,直至双击或右击结束测距。


核心:由于测距时,鼠标一直处于图片内部,且鼠标基本是移动的,所以IMAGE空间的mouseMove事件始终被触发。

而执行mouseMove的响应函数会阻塞其他事件的响应。

在这,我们就要借助IMAGE控件的父空间Grid,在父控件上定义mouseDown,这样,MouseMove的响应就不会被阻塞了。

这在图片处理上,给用户提供了更加友好的操作UI。

XAML代码

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="700">
    <Grid x:Name="grid" MouseDown="grid_MouseDown" MouseRightButtonDown="grid_MouseRightButtonDown">
        <Image Name="imgBox" Height="500" Width="600" Source="E:\\gyy.jpg"
               MouseWheel="ImgBoxMouseWheel" RenderOptions.BitmapScalingMode="NearestNeighbor" 
               MouseRightButtonDown="imgBox_MouseRightButtonDown" HorizontalAlignment="Center"
               VerticalAlignment="Center" MouseMove="imgBox_MouseMove" 
               MouseLeftButtonDown="imgBox_MouseLeftButtonDown">
            <Image.RenderTransform>
                <ScaleTransform x:Name="ScaleTran" />
            </Image.RenderTransform>
        </Image>
        <Canvas Name="Imgcanvas" Height="500" Width="600">
            <Polyline Stroke="Red" StrokeThickness="1" Name="lines"></Polyline>
            <Path Stroke="Red">
                <Path.Data>
                    <PathGeometry>
                        <PathFigure x:Name="pathImg">
                            <LineSegment x:Name="lineImg"/>
                        </PathFigure>
                    </PathGeometry>
                </Path.Data>
            </Path>
        </Canvas>
    </Grid>
</Window>
鼠标移动事件响应代码段

        private void imgBox_MouseMove(object sender, MouseEventArgs e) {
            if (captureMode) {
                pathImg.StartPoint = lineStartPoint;
                lineImg.Point = e.GetPosition(Imgcanvas);
            }
        }

        private void grid_MouseDown(object sender, MouseButtonEventArgs e) {
            captureMode = false;
            Point point = new Point();
            point = e.GetPosition(Imgcanvas);
            lineStartPoint = point;
            pointsCollection.Add(point);
            lines.Points = pointsCollection;
            captureMode = true;
        }

运行结果 



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8978次
    • 积分:194
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论