从CustomList自动完成TKCustomMap

时间:2017-08-01 17:34:34

标签: xamarin.forms

我从一个GitHub TkCustomMap项目TK.CustomMap中获取,我想调用我的自定义服务,填充我的自定义列表,以及在ItemSelected事件中,从自动完成的searchBar调用它到MapCenter它与我的列表模型中的坐标。 / p>

So far so good 我已经尝试过了,我停止了绑定和ItemSelect事件。

这是我的MapPage:

using Xamarin.Forms;
using Xamarin.Forms.Maps;

namespace TK.CustomMap.Sample
{
public partial class SamplePage : ContentPage
{
    public SamplePage()
    {
        //InitializeComponent();

        this.CreateView();
        this.BindingContext = new SampleViewModel();
    }

    private async void CreateView()
    {
        var autoComplete = new PlacesAutoComplete { ApiToUse = PlacesAutoComplete.PlacesApi.CustomList };
        autoComplete.SetBinding(PlacesAutoComplete.MapSelectedCommandProperty, "MapCenter");

        var newYork = new Position(40.7142700, -74.0059700);
        var mapView = new TKCustomMap(MapSpan.FromCenterAndRadius(newYork, Distance.FromKilometers(2)));
        mapView.IsShowingUser = true;
        mapView.SetBinding(TKCustomMap.CustomPinsProperty, "Pins");
        mapView.SetBinding(TKCustomMap.MapClickedCommandProperty, "MapClickedCommand");
        mapView.SetBinding(TKCustomMap.MapLongPressCommandProperty, "MapLongPressCommand");
        mapView.SetBinding(TKCustomMap.MapCenterProperty, "MapCenter");
        mapView.SetBinding(TKCustomMap.PinSelectedCommandProperty, "PinSelectedCommand");
        mapView.SetBinding(TKCustomMap.SelectedPinProperty, "SelectedPin");
        mapView.SetBinding(TKCustomMap.RoutesProperty, "Routes");
        mapView.SetBinding(TKCustomMap.PinDragEndCommandProperty, "DragEndCommand");
        mapView.SetBinding(TKCustomMap.CirclesProperty, "Circles");
        mapView.SetBinding(TKCustomMap.CalloutClickedCommandProperty, "CalloutClickedCommand");
        mapView.SetBinding(TKCustomMap.PolylinesProperty, "Lines");
        mapView.SetBinding(TKCustomMap.PolygonsProperty, "Polygons");
        mapView.SetBinding(TKCustomMap.MapRegionProperty, "MapRegion");
        mapView.SetBinding(TKCustomMap.RouteClickedCommandProperty, "RouteClickedCommand");
        mapView.SetBinding(TKCustomMap.RouteCalculationFinishedCommandProperty, "RouteCalculationFinishedCommand");
        mapView.SetBinding(TKCustomMap.TilesUrlOptionsProperty, "TilesUrlOptions");
        mapView.SetBinding(TKCustomMap.MapFunctionsProperty, "MapFunctions");
        mapView.IsRegionChangeAnimated = true;

        autoComplete.SetBinding(PlacesAutoComplete.BoundsProperty, "MapRegion");

        RelativeLayout _baseLayout = new RelativeLayout();
        _baseLayout.Children.Add(
            mapView,
            Constraint.RelativeToView(autoComplete, (r, v) => v.X),
            Constraint.RelativeToView(autoComplete, (r, v) => autoComplete.HeightOfSearchBar),
            heightConstraint: Constraint.RelativeToParent((r) => r.Height - autoComplete.HeightOfSearchBar),
            widthConstraint: Constraint.RelativeToView(autoComplete, (r, v) => v.Width));

        _baseLayout.Children.Add(
            autoComplete,
            Constraint.Constant(0),
            Constraint.Constant(0));
        Content = _baseLayout;
    }
  }
}

这是我的PlacesAutoComplete类:

using System;
using System.Collections.Generic;
using System.Linq;
using TK.CustomMap.Api;
using TK.CustomMap.Api.Google;
using TK.CustomMap.Api.OSM;
using Xamarin.Forms;
using Xamarin.Forms.Maps;
using static TK.CustomMap.Sample.SearchBarModel;

namespace TK.CustomMap.Sample
{
 public class SearchBarModel : IPlaceResult
 {
    public string Subtitle { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

public class PlacesAutoComplete : RelativeLayout
{
    public static BindableProperty BoundsProperty = BindableProperty.Create<PlacesAutoComplete, MapSpan>(
        p => p.Bounds,
        default(MapSpan));

    // TODO: SUMMARIES
    public enum PlacesApi
    {
        //Google,
        //Osm,
        //Native,
        //THIS IS MY LIST!
        CustomList
    }

    private readonly bool _useSearchBar;

    private bool _textChangeItemSelected;

    private SearchBar _searchBar;
    private Entry _entry;
    private ListView _autoCompleteListView;

    private IEnumerable<IPlaceResult> _predictions;

    public PlacesApi ApiToUse { get; set; }

    public static readonly BindableProperty MapSelectedCommandProperty =
        BindableProperty.Create<PlacesAutoComplete, Command<Position>>(
            p => p.SetMap, null);

    public List<SearchBarModel> myList = new List<SearchBarModel>();

    public Command<Position> SetMap
    {
        get { return (Command<Position>)this.GetValue(MapSelectedCommandProperty); }
        set { this.SetValue(MapSelectedCommandProperty, value); }
    }

    public double HeightOfSearchBar
    {
        get
        {
            return this._useSearchBar ? this._searchBar.Height : this._entry.Height;
        }
    }
    private string SearchText
    {
        get
        {
            return this._useSearchBar ? this._searchBar.Text : this._entry.Text;
        }
        set
        {
            if (this._useSearchBar)
                this._searchBar.Text = value;
            else
                this._entry.Text = value;
        }
    }
    public new MapSpan Bounds
    {
        get { return (MapSpan)this.GetValue(BoundsProperty); }
        set { this.SetValue(BoundsProperty, value); }
    }
    public PlacesAutoComplete(bool useSearchBar)
    {
        this._useSearchBar = useSearchBar;
        this.Init();
    }

    public string Placeholder
    {
        get { return this._useSearchBar ? this._searchBar.Placeholder : this._entry.Placeholder; }
        set
        {
            if (this._useSearchBar)
                this._searchBar.Placeholder = value;
            else
                this._entry.Placeholder = value;
        }
    }
    public PlacesAutoComplete()
    {
        this._useSearchBar = true;
        this.Init();
    }
    private void Init()
    {

        OsmNominatim.Instance.CountryCodes.Add("de");

        this._autoCompleteListView = new ListView
        {
            IsVisible = false,
            RowHeight = 40,
            HeightRequest = 0,
            BackgroundColor = Color.White
        };

        this._autoCompleteListView.ItemTemplate = new DataTemplate(typeof(MapSearchCell));

        View searchView;
        if (this._useSearchBar)
        {
            this._searchBar = new SearchBar
            {
                Placeholder = "Search for address..."
            };
            this._searchBar.TextChanged += SearchTextChanged;
            this._searchBar.SearchButtonPressed += SearchButtonPressed;

            searchView = this._searchBar;

        }
        else
        {
            this._entry = new Entry
            {
                Placeholder = "Sarch for address"
            };
            this._entry.TextChanged += SearchTextChanged;

            searchView = this._entry;
        }
        this.Children.Add(searchView,
            Constraint.Constant(0),
            Constraint.Constant(0),
            widthConstraint: Constraint.RelativeToParent(l => l.Width));

        this.Children.Add(
            this._autoCompleteListView,
            Constraint.Constant(0),
            Constraint.RelativeToView(searchView, (r, v) => v.Y + v.Height));

        this._autoCompleteListView.ItemSelected += ItemSelected;

        this._textChangeItemSelected = false;
    }

    private void SearchButtonPressed(object sender, EventArgs e)
    {
        if (this._predictions != null && this._predictions.Any())
            this.HandleItemSelected(this._predictions.First());
        else
            this.Reset();
    }

    private void SearchTextChanged(object sender, TextChangedEventArgs e)
    {
        if (this._textChangeItemSelected)
        {
            this._textChangeItemSelected = false;
            return;
        }

        this.SearchPlaces();
    }

    private async void SearchPlaces()
    {
        try
        {
            if (string.IsNullOrEmpty(this.SearchText))
            {
                this._autoCompleteListView.ItemsSource = null;
                this._autoCompleteListView.IsVisible = false;
                this._autoCompleteListView.HeightRequest = 0;
                return;
            }

            IEnumerable<IPlaceResult> result = null;

            if (this.ApiToUse == PlacesApi.CustomList)
            {

                myList.Add(new SearchBarModel
                {
                    Name = "Test1",
                    Description = "On item select, show me on map!",
                    Longitude = 20.4680701,
                    Latitude = 44.8152658
                });

                myList.Add(new SearchBarModel
                {
                    Name = "Test2",
                    Description = "On item select, show me on map!",
                    Longitude = 20.4233035,
                    Latitude = 44.805651,
                });
                myList.Add(new SearchBarModel
                {
                    Name = "Test3",
                    Description = "On item select, show me on map!",
                    Longitude = 20.456054,
                    Latitude = 44.8839925
                });
                myList.Add(new SearchBarModel
                {
                    Name = "Test4",
                    Description = "On item select, show me on map!",
                    Longitude = 20.4328035,
                    Latitude = 44.8071928,
                });

                result = myList.OfType<IPlaceResult>().ToList<IPlaceResult>();
            }
            else
            {
                result = await OsmNominatim.Instance.GetPredictions(this.SearchText);
            }

            if (result != null && result.Any())
            {
                this._predictions = result;

                this._autoCompleteListView.HeightRequest = result.Count() * 40;
                this._autoCompleteListView.IsVisible = true;
                this._autoCompleteListView.ItemsSource = this._predictions;
            }
            else
            {
                this._autoCompleteListView.HeightRequest = 0;
                this._autoCompleteListView.IsVisible = false;
            }
        }
        catch (Exception x)
        {
            // TODO
        }
    }
    //From here my code partially works
    private void ItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        if (e.SelectedItem == null) return;
        var prediction = (IPlaceResult)e.SelectedItem;

        this.HandleItemSelected(prediction);
    }

    private void HandleItemSelected(IPlaceResult prediction)
    {
        if (this.SetMap != null && this.SetMap.CanExecute(this))
        {
            this.SetMap.Execute(prediction);
        }

        this._textChangeItemSelected = true;

        this.SearchText = prediction.Description;
        this._autoCompleteListView.SelectedItem = null;

        this.Reset();
    }
    private void Reset()
    {
        this._autoCompleteListView.ItemsSource = null;
        this._autoCompleteListView.IsVisible = false;
        this._autoCompleteListView.HeightRequest = 0;

        if (this._useSearchBar)
            this._searchBar.Unfocus();
        else
            this._entry.Unfocus();
    }
  }
}

0 个答案:

没有答案