.NET MAUI — загрузка элемента управления картой и метод MoveToRegion не работают должным образомIOS

Программируем под IOS
Ответить
Anonymous
 .NET MAUI — загрузка элемента управления картой и метод MoveToRegion не работают должным образом

Сообщение Anonymous »

Я пытаюсь реализовать карту Google Maps с помощью Microsoft.Maui.Controls.Maps в разделе страницы, который отображается только при нажатии кнопки. Я сталкиваюсь с различными проблемами при перемещении центра карты. Я обнаружил, что если карта загружается в момент нажатия кнопки, метод MoveToRegion(MapSpan) не работает и карта загружается с центром в точке координат (0, 0). Чтобы решить эту проблему, я спрятал этот раздел страницы под другим элементом и показывал его в реальном размере только при нажатии кнопки. Однако это не оптимально, поскольку вызовы к API Google Maps выполняются даже тогда, когда этого не следует делать, что приводит к увеличению затрат на использование службы. Тем не менее, остается еще одна проблема. Если я попытаюсь использовать метод MoveToRegion после того, как уже установил центр, он не сработает и карта не переместится.
Подробнее о проекте:
Он основан на .NET 7.
Microsoft.Maui.Controls.Maps версии 7.0.101.
Использован шаблон MVVM.
Карта реализуется на странице с помощью настраиваемого элемента управления, в коде которого за ней выполняется MoveToRegion при изменении свойства, связанного с настраиваемым элементом управления.
Я проверил, что переданные координаты отличаются от тех, которые сейчас отображаются в центре, но карта по-прежнему не перемещается.
Это может быть проблемой, связанной с задержкой загрузки карту на экране, так как используется шаблон MVVM. На данный момент это остается лишь гипотезой.
Это XAML CustomControl:








Это код пользовательского элемента управления:
using System.Collections.Generic;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Devices.Sensors;
using Microsoft.Maui.Maps;
using xxx.ViewModels;
using static Microsoft.Maui.Controls.BindableProperty;

namespace xxx
{
public partial class MapView : ContentView
{
public static readonly BindableProperty AddressLabelProperty = Create(nameof(AddressLabel), typeof(string), typeof(MapView));
public static readonly BindableProperty CenterProperty = Create(nameof(Center), typeof(Location), typeof(MapView));
public static readonly BindableProperty DesiredHeightProperty = Create(nameof(DesiredHeight), typeof(double), typeof(MapView), 350D);
public static readonly BindableProperty GoToAddressListCommandProperty = Create(nameof(GoToAddressListCommand), typeof(IRelayCommand), typeof(MapView));
public static readonly BindableProperty IsScrollEnabledProperty = Create(nameof(IsScrollEnabled), typeof(bool), typeof(MapView), false);
public static readonly BindableProperty IsShowingUserProperty = Create(nameof(IsShowingUserProperty), typeof(bool), typeof(MapView), false);
public static readonly BindableProperty IsTrafficEnabledProperty = Create(nameof(IsTrafficEnabled), typeof(bool), typeof(MapView), false);
public static readonly BindableProperty IsZoomEnabledProperty = Create(nameof(IsZoomEnabled), typeof(bool), typeof(MapView), false);
public static readonly BindableProperty PinsProperty = Create(nameof(Pins), typeof(IEnumerable), typeof(MapView));
public new static readonly BindableProperty IsVisibleProperty = Create(nameof(IsVisible), typeof(bool), typeof(MapView), false, propertyChanged: OnIsVisibleChanged);

public string AddressLabel
{
get
{
return (string)this.GetValue(AddressLabelProperty);
}
set
{
this.SetValue(AddressLabelProperty, value);
}
}

public Location Center
{
get
{
return (Location)this.GetValue(CenterProperty);
}
set
{
this.SetValue(CenterProperty, value);
}
}

public double DesiredHeight
{
get
{
return (double)this.GetValue(DesiredHeightProperty);
}
set
{
this.SetValue(DesiredHeightProperty, value);
}
}

public IRelayCommand GoToAddressListCommand
{
get
{
return (IRelayCommand)this.GetValue(GoToAddressListCommandProperty);
}
set
{
this.SetValue(GoToAddressListCommandProperty, value);
}
}

public bool IsScrollEnabled
{
get
{
return (bool)this.GetValue(IsScrollEnabledProperty);
}
set
{
this.SetValue(IsScrollEnabledProperty, value);
}
}

public bool IsShowingUser
{
get
{
return (bool)this.GetValue(IsShowingUserProperty);
}
set
{
this.SetValue(IsShowingUserProperty, value);
}
}

public bool IsTrafficEnabled
{
get
{
return (bool)this.GetValue(IsTrafficEnabledProperty);
}
set
{
this.SetValue(IsTrafficEnabledProperty, value);
}
}

public new bool IsVisible
{
get
{
return (bool)this.GetValue(IsVisibleProperty);
}
set
{
this.SetValue(IsVisibleProperty, value);
}
}

public bool IsZoomEnabled
{
get
{
return (bool)this.GetValue(IsZoomEnabledProperty);
}
set
{
this.SetValue(IsZoomEnabledProperty, value);
}
}

public IEnumerable Pins
{
get
{
return (IEnumerable)this.GetValue(PinsProperty);
}
set
{
this.SetValue(PinsProperty, value);
}
}

public MapView()
{
this.InitializeComponent();
}

private static void OnIsVisibleChanged(BindableObject bindable, object oldValue, object newValue)
{
MapView mapView = bindable as MapView;
if (mapView == null)
return;

bool? isVisible = newValue as bool?;
if (!isVisible.HasValue)
return;

if (isVisible.Value)
{
mapView.Grid.HeightRequest = mapView.DesiredHeight;

if (mapView.Center != null)
{
MapSpan mapSpan = MapSpan.FromCenterAndRadius(new Location(mapView.Center.Latitude, mapView.Center.Longitude), new Distance(500));

mapView.Map.MoveToRegion(mapSpan);
}
}
else
mapView.Grid.HeightRequest = 1D;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/783 ... g-as-expec
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»