Я пытаюсь реализовать карту 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
.NET MAUI — загрузка элемента управления картой и метод MoveToRegion не работают должным образом ⇐ IOS
Программируем под IOS
1713509580
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;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78351838/net-maui-map-control-loading-and-movetoregion-method-are-not-working-as-expec[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия