я прочитал это Как отображать карты Google в темном режиме в приложении .NET MAUI (Android)
но НЕ дает реального ответа (MapType.StreetNight НЕ существует). Возможно ли установить темный/светлый режим в элементе управления картой в приложении MAUI?
нет возможности где-то найти решение
@FreakyAli, если возможно. Я также рассматривал возможность использования OpenStreetMaps (или любой возможной карты), но понятия не имею, с чего начать. Мне нужно использовать его только в Android и iOS (без Windows/Tyzen и т. д.)





Прежде всего, существует проблема Настройка стиля карты. Вы можете следить за этим. В качестве обходного пути вы можете вызвать для этого собственный код платформы.
Собственный элемент управления карты — MauiMKMapView , который реализует MKMapView, поэтому вы можете установить свойство overrideUserInterfaceStyle, чтобы получить темный режим.
Создайте собственный обработчик для карты:
namespace MauiAppTest.Platforms.iOS
{
public class CustomMapHandler : MapHandler
{
protected override void ConnectHandler(MauiMKMapView platformView)
{
platformView.OverrideUserInterfaceStyle = UIKit.UIUserInterfaceStyle.Dark;
base.ConnectHandler(platformView);
}
}
}
Кроме того, для этого можно использовать экземпляр элемента управления Map в методе OnHandlerChanged страницы, например:
(mapname.Handler.PlatformView as MauiMkMapView)
.OverrideUserInterfaceStyle = UIKit.UIUserInterfaceStyle.Dark;
Элемент управления картой использует карту Google. Итак, вы можете прочитать официальный документ о Добавить стилизованную карту.
Прежде всего, создайте JSON-файл темного режима (действие сборки — встроенный ресурс) о Справочнике стилей для Maps SDK для Android. Вы можете установить цвет темного режима самостоятельно.
Затем вы также можете создать собственный обработчик для платформы Android:
namespace MauiAppTest.Platforms.Android
{
class CustomMapHandler : MapHandler
{
protected override void ConnectHandler(MapView platformView)
{
var googlemap = this.Map;
var a = Assembly.GetExecutingAssembly();
using var stream = a.GetManifestResourceStream("MauiAppTest.dark_map_style.json");
string json = string.Empty;
using (var reader = new StreamReader(stream!))
{
json = reader.ReadToEnd();
}
googlemap.SetMapStyle(new Android.Gms.Maps.Model.MapStyleOptions(json));
base.ConnectHandler(platformView);
}
}
}
Или вы можете просто реализовать IOnMapReadyCallback, как это сделано в официальном документе карты Google:
public class MainActivity : MauiAppCompatActivity, IOnMapReadyCallback
{
public void OnMapReady(GoogleMap googleMap)
{
var a = Assembly.GetExecutingAssembly();
using var stream = a.GetManifestResourceStream("MauiAppTest.dark_map_style.json");
string json = string.Empty;
using (var reader = new StreamReader(stream!))
{
json = reader.ReadToEnd();
}
googlemap.SetMapStyle(new Android.Gms.Maps.Model.MapStyleOptions(json));
}
}
Наконец, используйте собственный обработчик в MauiProgram.cs:
UseMauiMaps().ConfigureMauiHandlers((handlers) =>
{
#if ANDROID
handlers.AddHandler(typeof(Map), typeof(MauiAppTest.Platforms.Android.CustomMapHandler));
#elif IOS
handlers.AddHandler(typeof(Map), typeof(MauiAppTest.Platforms.iOS.CustomMapHandler));
#endif
});
===============================
Вы можете просто получить Handler в методе HandlerChanged или в событии нажатия кнопки:
В xaml:
<Map x:Name = "map" ..../>
В методе OnHandlerChanged страницы или событии нажатия кнопки:
protected override void OnHandlerChanged()
{
base.OnHandlerChanged();
#if IOS
(map.Handler.PlatformView as MauiMkMapView)
.OverrideUserInterfaceStyle = UIKit.UIUserInterfaceStyle.Dark;
#elif ANDROID
var googlemap = (map.Handler as MapHandler).Map;
var a = Assembly.GetExecutingAssembly();
using var stream = a.GetManifestResourceStream("MauiAppTest.dark_map_style.json");
string json = string.Empty;
using (var reader = new StreamReader(stream!))
{
json = reader.ReadToEnd();
}
googlemap.SetMapStyle(new Android.Gms.Maps.Model.MapStyleOptions(json));
#endif
}
Спасибо. с .net 8.0 и с Xamarin.GooglePlayServices.Maps (и копирование вашего кода) выдает ошибку. Тип androidx.collection.ArraySetKt определен несколько раз: C:\Users\ddepa\.nuget\packages\xamarin.androidx.collection.j vm\1.3.0.2\buildTransitive\net7.0-android33.0\..\..\jar\androidx.collection.collection-jvm.jar:androidx/collection/Array SetKt.class, C:\Users\ddepa\.nuget\packages\xamarin.androidx.collection.ktx\1.2.0.9\buildTransitive\net6.0-android31.0\..\.. \jar\androidx.collection.collection-ktx.jar:androidx/collection/ArraySetKt.class 1>MSBUILD: ошибка java.exe JAVA0000:
@DenisDePauli Вам не нужно устанавливать Xamarin.GooglePlayServices.Maps, просто добавьте Microsoft.Maui.Controls.Maps NuGet package и затем используйте мой код.
Извините, но эта строка не работает => googlemap.SetMapStyle(new Android.Gms.Maps.Model.MapStyleOptions(json)); Ошибка CS0234 Тип или имя пространства под именем «Gms» не существует в пространстве под именем «VTR_Mobile.Platforms.Android». Вероятно, вам будет предложена вся сборка. VTR Mobile (net8.0-android34.0) C:\Progetti\net\VTR Mobile\VTR Mobile\Platforms\Android\CustomMapHandler.cs (отсутствует сборка) Мой Microsoft.Maui.Controls.Maps — версия 8.0.40
Чжан, не спрашивай меня, почему... если я удалю пространство имен из Android.Gms.Maps.Model.MapStyleOptions и добавлю директиву using... работает. Странно, но работает :D
Спасибо!!! попробую загрузить свою "ночную версию"
Все сделано... но никогда не переходит в обработчик (даже если я меняю тему)... Я УВЕРЕН, что скопировал все (очевидно, я изменил пространства имен), но ничего... сложнее, чем я думаю...
Вы пытались заставить ManActivity реализовать интерфейс IOnMapReadyCallback для Android? Или вы можете попытаться получить хнальдлер в моем ответе на обновление. @ДенисДеПаули
Вам нужно это как для Android, так и для iOS?