Как сделать собственное информационное окно в картах xamarin? - PullRequest
0 голосов
/ 25 марта 2019

Я хочу создать собственное информационное окно на моей карте форм Xamarin. Как я могу это реализовать. Я использую плагин карты xamarin.forms.map для создания карты.Пожалуйста, помогите мне, я хочу пользовательское информационное окно, как это

я делаю пользовательскую карту и пользовательский пин

 public class CustomMap : Map
    {
        public List<CustomPin> CustomPins { get; set; }
        }

Пользовательский пин

public class CustomPin : Pin
    {
        public string ImageUrl { get; set; }

        public float rating { get; set; }
}

Страница карты xaml.cs

public partial class MapPage : ContentPage
    {
        CustomPin pin;
        MapVM MapVM;
        public MapPage()
        {
            InitializeComponent();

            pin = new CustomPin
            {
                Type = PinType.Place,
                Position = new Position(37.79752, -122.40183),
                Label = "Xamarin San Francisco Office",
                Address = "394 Pacific Ave, San Francisco CA",
                Url = "http://xamarin.com/about/",
                rating = 3

            };
            var pin1 = new CustomPin
            {
                Type = PinType.Place,
                Position = new Position(38.79752, -124.40183),
                Label = "Xamarin San Francisco Office",
                Address = "395 Pacific Ave, San Francisco CA",
                Url = "http://xamarin.com/about/",
                rating=2

            };

            customMap.CustomPins = new List<CustomPin> { pin, pin1 };
             customMap.Pins.Add(pin);
            customMap.Pins.Add(pin1);
            customMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(37.79752, -122.40183), Distance.FromMiles(1.0)));
        }
}

Теперь я не знаю, как сделать пользовательский класс рендеринга.Пожалуйста, помогите мне, как я могу определить пользовательский класс рендеринга и как я назначаю значения изображения и значения рейтинга для отображения в информационном окне ..

CustomRender.cs

[assembly: ExportRenderer(typeof(CustomMap), typeof(CustomMapRenderer))]
namespace CustomRenderer.Droid
{
    public class CustomMapRenderer : MapRenderer, GoogleMap.IInfoWindowAdapter
    {
        List<CustomPin> customPins;

        public CustomMapRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Map> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                NativeMap.InfoWindowClick -= OnInfoWindowClick;
            }

            if (e.NewElement != null)
            {
                var formsMap = (CustomMap)e.NewElement;
                customPins = formsMap.CustomPins;
                Control.GetMapAsync(this);
            }
        }

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

            NativeMap.InfoWindowClick += OnInfoWindowClick;
            NativeMap.SetInfoWindowAdapter(this);
        }
        protected override MarkerOptions CreateMarker(Pin pin)
{
    var marker = new MarkerOptions();
    marker.SetPosition(new LatLng(pin.Position.Latitude, pin.Position.Longitude));
    marker.SetTitle(pin.Label);
    marker.SetSnippet(pin.Address);
    return marker;
}
public Android.Views.View GetInfoContents (Marker marker)
{
  var inflater = Android.App.Application.Context.GetSystemService (Context.LayoutInflaterService) as Android.Views.LayoutInflater;
  if (inflater != null) {
    Android.Views.View view;

    var customPin = GetCustomPin (marker);
    if (customPin == null) {
      throw new Exception ("Custom pin not found");
    }

    if (customPin.Id.ToString() == "Xamarin") {
      view = inflater.Inflate (Resource.Layout.XamarinMapInfoWindow, null);
    } else {
      view = inflater.Inflate (Resource.Layout.MapInfoWindow, null);
    }

    var infoTitle = view.FindViewById<TextView> (Resource.Id.InfoWindowTitle);
    var infoSubtitle = view.FindViewById<TextView(Resource.Id.InfoWindowSubtitle);
 var imageView = view.FindViewById<ImageView>(Resource.Id.image);
            var ratings = view.FindViewById<RatingBar>(Resource.Id.ratingbar);
//here how i set values for Image and Rating Cotrol

    if (infoTitle != null) {
      infoTitle.Text = marker.Title;
    }
    if (infoSubtitle != null) {
      infoSubtitle.Text = marker.Snippet;
    }

    return view;
  }
  return null;
}
    }
}

1 Ответ

1 голос
/ 25 марта 2019

Вы можете определить компонент, основанный на компоненте Xamarin.Forms, и вы можно изменить его, добавив некоторое связываемое свойство, объект и т. д. Кроме того, вы можете извлечь из макета, такого как стек, поток и т. д., вместо компонента Xamarin.Forms. Таким образом, вы можете улучшить уровень настройки.

На стороне Android

    [assembly: ExportRenderer(typeof(CustomEntry), typeof(AndroidCustomEntryRenderer))]
namespace MyProject.Droid.Renderer
{
    public class AndroidCustomEntryRenderer : EntryRenderer
    {
        public AndroidCustomEntryRenderer(Context context) : base(context)
        {
        }
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.SetBackgroundColor(global::Android.Graphics.Color.White);

            }
        }
    }
} 

На стороне PCL

namespace MyProject.Views.ViewComponents
{
    public class CustomEntry : Entry
    {
    }
}
...