【问题标题】:How to get the latitude and longtitude in the center of view.map (Xamarin.Forms.Maps) when region changed?区域更改时如何获取view.map(Xamarin.Forms.Maps)中心的经纬度?
【发布时间】:2020-03-29 00:35:28
【问题描述】:

请评论,当区域更改时,如何获取地图中心(Xamarin.Forms.Maps)的经纬度?在 C# 中,检索属性“Map.VisibleRegion”(https://docs.microsoft.com/en-us/dotnet/api/xamarin.forms.maps.map.visibleregion?view=xamarin-forms) 并找到相关属性“MapSpan.Center”。但是,它与 F# 的 fabulous 不同,我不知道如何从 view.map 中检索属性。谢谢。

let view (model : Model) dispatch =
    let paris = Position(48.8566, 2.3522)
    let london = Position(51.5074, -0.1278)
    let calais = Position(50.9513, 1.8587)

    let map =
        View.Map
            (hasZoomEnabled = true, hasScrollEnabled = true,
             pins = [ View.Pin(paris, label = "Paris", pinType = PinType.Place)
                      View.Pin(london, label = "London", pinType = PinType.Place) ],
             requestedRegion = MapSpan.FromCenterAndRadius(calais, Distance.FromKilometers(300.0)))
    // View
    View.ContentPage(content = map)
    -- e.g map.visibleRegion

【问题讨论】:

  • 您好,您可以看看这个示例(alejandroruizvarela.blogspot.com/2015/07/…)。
  • 您好,@JuniorJiang-MSFT,感谢您的帮助。我看过这个样本。因为我的应用程序正在使用美妙的 UI 来实现一个简单的模型-视图-更新 (MVU) 应用程序模式,类似于 Elm 架构。将此示例应用到我的应用程序中非常复杂。
  • SelectedRegion 添加到您的模型中。将新的SelectRegion 消息添加到您的消息列表中。然后在您的update 函数中,使SelectRegion 消息更改模型。接下来,您需要在 UI 中使用区域选择器来触发消息以更新模型 dispatch (SelectRegion model.regions.calais) 或类似的模型,尽管我猜您不希望像这样对区域进行硬编码。然后你需要做的就是用model.SelectedRegion替换上面视图函数中硬编码的calais
  • @drkmtr。谢谢你的帮助。硬编码的“加来”用于简化问题。当用户更改位置(例如缩放、拖动或俯仰)时,我找不到使用地图中心位置(纬度和经度)更新模型的方法(回调或属性)。
  • 抱歉,我完全误解了这个问题哈。

标签: xamarin.forms f# elmish xamarin.forms.maps


【解决方案1】:

根据 Tim Lariviere 的评论 (https://github.com/fsprojects/Fabulous/issues/635),问题已得到解决。谢谢。

let mapRef = ViewRef<Map>()

......
let tryGetCameraPosition() =
        match mapRef.TryValue with 
                          | None -> Some (0.0, 0.0) |> Option.map (fun l -> CameraPositionRetrieved(l))
                          | Some obj -> 
                                let map = obj :?> Xamarin.Forms.Maps.Map
                                let c = map.VisibleRegion.Center
                                Some (c.Latitude, c.Longitude) |> Option.map (fun l -> CameraPositionRetrieved(l))
......
let update msg model =
    match msg with
    | UpdateCameraPosition  -> 
        let msg = tryGetCameraPosition()
        model, Cmd.ofMsgOption msg
    | CameraPositionRetrieved location -> { model with CameraPosition = Some location }, Cmd.none

......
let view (model : Model) dispatch =
......
View.Map(hasZoomEnabled = true, hasScrollEnabled = true, ref = mapRef,

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2022-08-21
    • 1970-01-01
    相关资源
    最近更新 更多