簡體   English   中英

如何在Xamarin.Forms中單擊按鈕時從地圖上刪除折線

[英]How to remove polyline from the map on button click in Xamarin.Forms

我正在使用CustomMapRenderer.csExtendedMap.cs通過點擊(觸摸事件)在地圖上繪制polylines

在Visual Studio 2015解決方案中, ExtendedMap.csMapTap (Portable)項目中,而CustomMapRenderer.csMapTap.Android項目中。

CustomMapRenderer.cs

using System.Collections.Generic;
using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using MapTap;
using MapTap.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Maps;
using Xamarin.Forms.Maps.Android;
using System;

[assembly: ExportRenderer(typeof(ExtendedMap), typeof(CustomMapRenderer))]
[assembly: Dependency(typeof(CustomMapRenderer))]

namespace MapTap.Droid
{
    public class CustomMapRenderer : MapRenderer, IOnMapReadyCallback,ClearPolyline
    {
        GoogleMap map;
        List<LatLng> polygontest = new List<LatLng>();

        public CustomMapRenderer()
        {
        }

        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Map> e)
        {          
            if (map != null)
                map.MapClick -= googleMap_MapClick;
            base.OnElementChanged(e);
            if (Control != null)
                ((MapView)Control).GetMapAsync(this);
        }

        public void OnMapReady(GoogleMap googleMap)
        {
            map = googleMap;
            if (map != null)
                map.MapClick += googleMap_MapClick; ;
        }

        private void googleMap_MapClick(object sender, GoogleMap.MapClickEventArgs e)
        {
            polygontest.Add(new LatLng(e.Point.Latitude, e.Point.Longitude));
            ((ExtendedMap)Element).OnTap(new Position(e.Point.Latitude, e.Point.Longitude));           

            if (polygontest.Count >1 )
            {
                AddPolygons();               
            }
        }
        public void Clearline()
        {
           map.Clear();
        }

        void AddPolygons()
        {
           var polygonOptions = new PolylineOptions();

            polygonOptions.InvokeColor(0x66FF0000);

            foreach (var position in polygontest)
            {
                polygonOptions.Add(new LatLng(position.Latitude, position.Longitude));
            }

            map.AddPolyline(polygonOptions);
            polygontest.RemoveAt(0);
        }   
    }
}

ExtendedMap.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms.Maps;
using Xamarin.Forms.Maps.Android;
using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using Xamarin.Forms;

namespace MapTap
{   
    public class ExtendedMap : Map
    {
        public event EventHandler<TapEventArgs> Tap;
        public ExtendedMap()
        {            
        }

        public ExtendedMap(MapSpan region) : base(region)
        {
        }

        public void OnTap(Position coordinate)
        {
            OnTap(new TapEventArgs { Position = coordinate });

            var lat = coordinate.Latitude;
            var lng = coordinate.Longitude;

            putpinonclick(lat,lng);
        }

        public void putpinonclick(double lat, double lng)
        {
            var pin = new Pin
            {
                Type = PinType.SavedPin,
                Position = new Position(lat, lng),
                Label = "Xamarin San Francisco Office",
                Address = "394 Pacific Ave, San Francisco CA"
            };

            this.Pins.Add(pin);           
        }

        protected virtual void OnTap(TapEventArgs e)
        {
            var handler = Tap;
            if (handler != null) handler(this, e);
        }
    }

    public class TapEventArgs : EventArgs
    {
        public Position Position { get; set; }
    }
}

我想從MainPage.xaml單擊按鈕(清除按鈕)時清除折線。

以下是正在運行的應用程序的屏幕截圖屏幕截圖

我正在使用MainPage.Xaml.cs調用CustomMapRendrer.cs函數

 var test = DependencyService.Get<ClearPolyline>();
                test.Clearline();

ClearPolyLine是一個接口,而在CustomMapRender實現的接口功能中的Clearline

問題是,當我調用上面的代碼行時,變量test本身不為null ,但是其所有成員變量(在CustomMapRenderer實現)均為null。 test的類型為ClearPolyline

如何解決這個問題?

PolyLine addedLine = map.AddPolyline(polygonOptions); 這應該返回添加的PolyLine,因此將此Ployline存儲在屬性或集合中。 在按鈕上單擊或命令打擾RemovePolyline property (自定義可綁定屬性),並在擴展渲染器中並基於調用addedLine.remove();的值來addedLine.remove();屬性更改addedLine.remove(); 或循環收集折線並將其刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM