Net MAUI MAPS Темный режим

я прочитал это Как отображать карты Google в темном режиме в приложении .NET MAUI (Android)

но НЕ дает реального ответа (MapType.StreetNight НЕ существует). Возможно ли установить темный/светлый режим в элементе управления картой в приложении MAUI?

нет возможности где-то найти решение

Вам нужно это как для Android, так и для iOS?

FreakyAli 19.05.2024 01:19

@FreakyAli, если возможно. Я также рассматривал возможность использования OpenStreetMaps (или любой возможной карты), но понятия не имею, с чего начать. Мне нужно использовать его только в Android и iOS (без Windows/Tyzen и т. д.)

Denis De Pauli 19.05.2024 19:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, существует проблема Настройка стиля карты. Вы можете следить за этим. В качестве обходного пути вы можете вызвать для этого собственный код платформы.

  • На iOS

Собственный элемент управления карты — 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\buildTran‌​sitive\net7.0-androi‌​d33.0\..\..\jar\andr‌​oidx.collection.coll‌​ection-jvm.jar:andro‌​idx/collection/Array‌ ​SetKt.class, C:\Users\ddepa\.nuget\packages\xamarin.androidx.collection.k‌​tx\1.2.0.9\buildTran‌​sitive\net6.0-androi‌​d31.0\..\.. \jar\andr‌​oidx.collection.coll‌​ection-ktx.jar:andro‌​idx/collection/Array‌​SetKt.class 1>MSBUILD: ошибка java.exe JAVA0000:

Denis De Pauli 22.05.2024 11:39

@DenisDePauli Вам не нужно устанавливать Xamarin.GooglePlayServices.Maps, просто добавьте Microsoft.Maui.Controls.Maps NuGet package и затем используйте мой код.

Liyun Zhang - MSFT 22.05.2024 11:45

Извините, но эта строка не работает => 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

Denis De Pauli 22.05.2024 12:13

Чжан, не спрашивай меня, почему... если я удалю пространство имен из Android.Gms.Maps.Model.MapStyleOptions и добавлю директиву using... работает. Странно, но работает :D

Denis De Pauli 22.05.2024 12:19

Спасибо!!! попробую загрузить свою "ночную версию"

Denis De Pauli 22.05.2024 12:20

Все сделано... но никогда не переходит в обработчик (даже если я меняю тему)... Я УВЕРЕН, что скопировал все (очевидно, я изменил пространства имен), но ничего... сложнее, чем я думаю...

Denis De Pauli 22.05.2024 15:05

Вы пытались заставить ManActivity реализовать интерфейс IOnMapReadyCallback для Android? Или вы можете попытаться получить хнальдлер в моем ответе на обновление. @ДенисДеПаули

Liyun Zhang - MSFT 23.05.2024 02:55

Другие вопросы по теме