You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Maui.NET选中PIN后无法取值的解决方案求助

解决方案:通过Messenger传递PIN点击事件(替代依赖注入方案)

1. 共享项目定义消息类

创建跨平台通信的消息载体,用于传递PIN ID:

// 共享项目/Models/PinClickedMessage.cs
public class PinClickedMessage
{
    public string PinId { get; set; }

    public PinClickedMessage(string pinId)
    {
        PinId = pinId;
    }
}

2. 共享项目ViewModel注册消息接收

在ViewModel中绑定消息接收逻辑,直接调用HandlePinRetrieved方法:

// 共享项目/ViewModels/MapViewModel.cs
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.ComponentModel;

public class MapViewModel : ObservableObject, IRecipient<PinClickedMessage>
{
    public MapViewModel()
    {
        WeakReferenceMessenger.Default.Register(this);
    }

    public void Receive(PinClickedMessage message)
    {
        HandlePinRetrieved(message.PinId);
    }

    private void HandlePinRetrieved(string pinId)
    {
        // 替换为你的业务逻辑
        Console.WriteLine($"获取到选中PIN的ID: {pinId}");
    }

    // 销毁ViewModel时注销消息,避免内存泄漏
    public void Cleanup()
    {
        WeakReferenceMessenger.Default.Unregister<PinClickedMessage>(this);
    }
}

3. Android端自定义Renderer传递消息

修改Marker点击处理逻辑,通过Messenger发送PIN ID,无需依赖注入ViewModel:

// Android平台/Renderers/CustomMapRenderer.cs
using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Maui.Controls.Maps;
using Microsoft.Maui.Maps;
using Android.Content;

[assembly: ExportRenderer(typeof(Map), typeof(CustomMapRenderer))]
namespace YourAppNamespace.Droid.Renderers
{
    public class CustomMapRenderer : MapRenderer, GoogleMap.IOnMarkerClickListener
    {
        public CustomMapRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null) Control.GetMapAsync(this);
        }

        protected override void OnMapReady(GoogleMap map)
        {
            base.OnMapReady(map);
            map.SetOnMarkerClickListener(this);
        }

        public bool OnMarkerClick(Marker marker)
        {
            if (marker.Tag is string pinId)
            {
                WeakReferenceMessenger.Default.Send(new PinClickedMessage(pinId));
            }
            // 返回false保留地图默认点击行为(如显示信息窗口),返回true则拦截
            return false;
        }

        // 绑定PIN ID到Marker的Tag
        protected override MarkerOptions CreateMarker(Pin pin)
        {
            var markerOptions = base.CreateMarker(pin);
            if (pin is CustomPin customPin)
            {
                markerOptions.SetTag(customPin.Id);
            }
            return markerOptions;
        }
    }
}

4. 共享项目自定义Pin类

扩展Pin类,存储ID用于关联Marker:

// 共享项目/Models/CustomPin.cs
public class CustomPin : Pin
{
    public string Id { get; set; }
}

替代方案:直接通过BindingContext调用ViewModel方法

如果不想用Messenger,可直接从Map控件获取ViewModel:

// Android端CustomMapRenderer的OnMarkerClick方法
public bool OnMarkerClick(Marker marker)
{
    if (marker.Tag is string pinId && Element.BindingContext is MapViewModel viewModel)
    {
        viewModel.HandlePinRetrieved(pinId);
    }
    return false;
}

依赖配置

确保安装NuGet包支持Messenger:

Install-Package CommunityToolkit.Mvvm

内容的提问来源于stack exchange,提问作者Pxaml

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:16:06