Event listeners
Add and remove
Listener listener = await map.OnClick("my-layer", e => { ... });
await listener.Remove(); // calls map.off() in JavaScript
Listener implements IAsyncDisposable — use await using or DisposeAsync() on the component.
APIs
AddListener<T>(eventName, handler, layer?, throttleMs?)— generic subscriptionAddListener<T>(eventName, handler, params string[] layerIds)— multiple layersAddOnceListener<T>/AddOnceAsyncListener<T>— single fire (map.once), including multi-layer overloadsRemoveAllListeners(eventName?)— detach all listeners on this mapOnClick,OnMoveEnd,OnIdle,OnMouseMove(with optionalthrottleMs),OnData,OnSourceData,OnErrorOnTouchStart,OnTouchEnd,OnTouchMove,OnTouchCancel— useMapTouchEventOnWheel,OnRender,OnStyleImageMissing,OnDragStart,OnDrag,OnDragEndOnStyleDataLoading,OnSourceDataLoading— loading-phase data eventsOnCooperativeGesturePrevented,OnProjectionTransition,OnTerrain,OnSourceDataAbort
Event model reference
| Event | Model | Convenience API | Layer filter |
|---|---|---|---|
click, mousemove, mouse events |
MapMouseEvent |
OnClick, OnMouseMove |
Yes |
touchstart, touchmove, touchend, touchcancel |
MapTouchEvent |
OnTouch* |
Yes |
wheel |
MapWheelEvent |
OnWheel |
No |
moveend, camera/drag |
MapMoveEvent / MapEvent |
OnMoveEnd, OnDrag* |
No |
data, sourcedata, sourcedataabort, styledataloading, sourcedataloading |
MapDataEvent |
OnData, OnSourceData, OnSourceDataAbort, OnStyleDataLoading, OnSourceDataLoading |
No |
error |
MapErrorEvent |
OnError |
No |
styleimagemissing |
MapStyleImageMissingEvent |
OnStyleImageMissing (observe only in MapLibre 6+; use SetMissingStyleImageResolver to supply images) |
No |
render, idle |
MapEvent |
OnRender, OnIdle |
No |
cooperativegestureprevented |
MapCooperativeGestureEvent |
OnCooperativeGesturePrevented |
No |
projectiontransition |
MapProjectionEvent |
OnProjectionTransition |
No |
terrain |
MapTerrainEvent |
OnTerrain |
No |
Aliases (MapLibre 6 naming): MapSourceDataEvent / MapStyleDataEvent (data events), MapMovementEvent (camera), MapBoxZoomEvent (boxzoom).
Compact interop DTO includes dataType, sourceId, sourceDataType, isSourceLoaded, tile, newProjection, and missing-image id in addition to type / point / lngLat / features.
Pitfalls
- Always remove listeners when re-subscribing (e.g. before adding a duplicate handler).
MapMouseEvent.FeaturesisLayerFeatureFeature[]— use the same shape asQueryRenderedLayerFeatures.- Layer-scoped events require the layer to exist before subscribing.
preventDefault()is not available from C#. MapLibre requires callingpreventDefault()synchronously in the JavaScript event handler. Because Blazor invokes .NET callbacks asynchronously afterJSON.stringify, you cannot block default map gestures from C#. UseMapOptionsinstead (CooperativeGestures,DragPan,ScrollZoom, etc.) or handle gestures in custom JavaScript.
Marker and Popup handles
AddMarkerreturnsMapMarker—SetLngLat,SetRotation,SetDraggable,SetPopup,TogglePopup,OnClick,OnDrag*AddPopupreturnsMapPopup—SetHtml,SetText,TrackPointer,IsOpen,OnOpen,OnCloseCreatePopupremains as a legacy wrapper aroundAddPopup