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

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

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


核心:由于测距时,鼠标一直处于图片内部,且鼠标基本是移动的,所以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;
        }

运行结果 



阅读更多
个人分类: WPF
想对作者说点什么? 我来说一句

鼠标移动距离测量器源码

2006年01月12日 14KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭