You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 7.0 WinForms如何获取当前GPS位置并在DevExpress地图展示

在.NET Core 7.0 WinForms中获取当前位置并适配DevExpress地图的方案

方案一:使用Windows.Devices.Geolocation WinRT API

.NET Core 3.0及以上版本支持调用WinRT API,这是Windows平台原生的定位方案,兼容性和准确性都有保障。

实现步骤:

  1. 确认项目配置
    你的WinForms项目默认已启用WinForms支持,若需显式配置,可在项目的.csproj文件中添加以下节点:

    <PropertyGroup>
        <UseWindowsForms>true</UseWindowsForms>
        <EnableWindowsTargeting>true</EnableWindowsTargeting>
    </PropertyGroup>
    
  2. 编写定位获取代码
    通过异步方法请求定位权限并获取当前坐标:

    using Windows.Devices.Geolocation;
    using System.Threading.Tasks;
    
    public async Task<(double Latitude, double Longitude)> GetCurrentLocationAsync()
    {
        // 请求定位权限
        var accessStatus = await Geolocator.RequestAccessAsync();
        if (accessStatus != GeolocationAccessStatus.Allowed)
        {
            throw new InvalidOperationException("定位权限未被授予,请在系统设置中开启定位权限");
        }
    
        // 初始化定位器,设置高精度模式
        var geolocator = new Geolocator
        {
            DesiredAccuracy = PositionAccuracy.High,
            MovementThreshold = 10 // 位置变化超过10米时更新
        };
    
        // 获取当前位置
        var geoposition = await geolocator.GetGeopositionAsync();
        var position = geoposition.Coordinate.Point.Position;
    
        return (position.Latitude, position.Longitude);
    }
    
  3. 适配DevExpress MapControl
    将获取到的坐标绑定到DevExpress地图组件,设置地图中心并添加定位标记:

    using DevExpress.XtraMap;
    
    // 假设mapControl是窗体上的DevExpress MapControl实例
    private async void Form_Load(object sender, EventArgs e)
    {
        try
        {
            var currentLocation = await GetCurrentLocationAsync();
    
            // 设置地图坐标系与中心位置
            mapControl.CoordinateSystem = new GeoMapCoordinateSystem();
            mapControl.CenterPoint = new GeoPoint(currentLocation.Latitude, currentLocation.Longitude);
            mapControl.ZoomLevel = 15; // 调整为合适的缩放级别
    
            // 添加定位标记
            var locationPin = new MapPushpin
            {
                Location = new GeoPoint(currentLocation.Latitude, currentLocation.Longitude),
                Text = "我的位置",
                MarkerSize = 20
            };
    
            // 将标记添加到地图图层
            var vectorLayer = new VectorItemsLayer();
            vectorLayer.Items.Add(locationPin);
            mapControl.Layers.Add(vectorLayer);
        }
        catch (Exception ex)
        {
            MessageBox.Show($"获取位置失败:{ex.Message}");
        }
    }
    

方案二:使用第三方定位库

如果需要跨平台兼容(虽然你的场景是WinForms),可以使用NuGet上的第三方库(如Geolocator),但Windows平台下原生WinRT方案更推荐。

注意事项

  • 确保用户设备已开启系统定位服务,否则无法获取位置。
  • 传统WinForms exe需要在app.manifest中添加定位权限声明:
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v2">
            <privilege name="SeLocationPrivilege" />
          </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
    
  • 若打包为MSIX应用,需在Package.appxmanifest中添加定位权限。

内容的提问来源于stack exchange,提问作者Diego Estraviz Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:58:14