【问题标题】:Xamarin google maps bindings:BindingPinsBehavior not showing Pins on mapXamarin 谷歌地图绑定:BindingPinsBehavior 未在地图上显示引脚
【发布时间】:2020-11-22 19:16:06
【问题描述】:

我可以使用以下功能与地图进行交互。设置缩放、当前位置甚至显示多边形。就是无法显示任何图钉。

我正在向 MapView 获取 pin 数据,并且经过测试,它在

中可见

还在地图上添加了一个点击事件,可以看到正确的针数。

问题是没有引脚可见。已尝试使用默认引脚以及使用 .Icon 的自定义引脚

这是我的 MapViewModel.cs

using MapApp.Mobile.Core.Contracts.Services.General;
using MapApp.Mobile.Core.ViewModels.Base;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using MapApp.Mobile.Core.Services.Data;
using MapApp.Mobile.Core.Contracts.Services.Data;
using System.Collections.ObjectModel;
using Xamarin.Forms.GoogleMaps;
using MapApp.Mobile.Core.Models;

using Xamarin.Forms.GoogleMaps.Bindings;
using Xamarin.Forms;


using Plugin.Geolocator.Abstractions;

namespace MapApp.Mobile.Core.ViewModels
{
    public class MapViewModel : ViewModelBase
    {
        private readonly IZoneService _zoneService;
        private readonly IAddressService _addressService;

        //Expands to a region
        private MapSpan _visibleRegion;
        public MapSpan VisibleRegion
        {
            get => _visibleRegion;
            set
            {
                _visibleRegion = value;
                RaisePropertyChanged(() => VisibleRegion);
            }
        }

        //Map collection of pins
        private ObservableCollection<Pin> _pins;
        public ObservableCollection<Pin> Pins
        {
            get => _pins;
            set
            {
                _pins = value;
                RaisePropertyChanged(() => Pins);
            }
        }

        private ObservableCollection<Polygon> _nogoZones;
        public ObservableCollection<Polygon> NogoZones
        {
            get => _nogoZones;
            set {
                _nogoZones = value;
                RaisePropertyChanged(() => NogoZones);
            }
        
        }

        public MoveToRegionRequest MoveToRegionRequest { get; } = new MoveToRegionRequest();

        public MapViewModel(IConnectionService connectionService,
            INavigationService navigationService, IDialogService dialogService,
            IZoneService zoneService, IAddressService addressService)
            : base(connectionService, navigationService, dialogService)
        {


            _zoneService = zoneService;
            _addressService = addressService;
        }

        public Command<MapClickedEventArgs> MapClickedCommand =>
            new Command<MapClickedEventArgs>(args =>
            {
                Pins.Add(new Pin
                {
                    Label = $"Pin{Pins.Count}",
                    Position = args.Point
                });
            });


        //public override async Task InitializeAsync(object navigationData)
        public override async Task InitializeAsync(object navigationData)
        {
            Coordinates defaultCoordinates = _zoneService.GetAssignedLatitudeLongitude();

            //Sets the visible view of the maps - 0.25 miles around the centre of the coord point
            VisibleRegion = MapSpan.FromCenterAndRadius(
                new Xamarin.Forms.GoogleMaps.Position(defaultCoordinates.Latitude, defaultCoordinates.Longitude),
                Distance.FromMiles(0.25));

            MoveToRegionRequest.MoveToRegion(VisibleRegion);


            //Get near by address to current location
            var addresses = await _addressService.GetNearbyAddressesAsync(defaultCoordinates.Latitude, defaultCoordinates.Longitude);

            //Now populate on the map                
            _pins = new ObservableCollection<Pin>();
            foreach (Models.Address a in addresses)
            {

                Xamarin.Forms.GoogleMaps.Pin p = new Xamarin.Forms.GoogleMaps.Pin();
                p.Type = PinType.Generic;
                p.Address = a.Address1;
                p.Label = a.AddressDisplay;
                p.Position = new Xamarin.Forms.GoogleMaps.Position((double)a.Latitude, (double)a.Longitude);
                p.Icon = BitmapDescriptorFactory.FromBundle(a.AddressStatus.Icon);


                _pins.Add(p);

            }
            Pins = new ObservableCollection<Pin>(_pins);
            RaisePropertyChanged(() => Pins);


            var zones = _zoneService.GetZones();

            foreach (var zone in zones)
            {
                Polygon zonePolygon = new Polygon
                {
                    StrokeColor = Color.DarkRed,
                    FillColor = Color.FromRgba(255, 0, 0, 0.5f),
                    StrokeWidth = 3f,
                    Tag = zone.Name,
                };
                foreach (var coordinates in zone.Bounds)
                {
                    zonePolygon.Positions.Add(new Xamarin.Forms.GoogleMaps.Position(coordinates.Latitude, coordinates.Longitude));
                }
                _nogoZones.Add(zonePolygon);
            }
        }

    }
}

这是 MapView.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MapApp.Mobile.Core.Views.MapView"
            xmlns:utility="clr-namespace:MapApp.Mobile.Core.Utility;assembly=MapApp.Mobile.Core"             
             utility:ViewModelLocator.AutoWireViewModel="True"             
             xmlns:maps="clr-namespace:Xamarin.Forms.GoogleMaps;assembly=Xamarin.Forms.GoogleMaps"
             xmlns:bindings="clr-namespace:Xamarin.Forms.GoogleMaps.Bindings;assembly=Xamarin.Forms.GoogleMaps.Bindings"
             Title="Map">
    
    <ContentPage.Content>
        <StackLayout>

            <Grid>
                <ListView VerticalOptions="FillAndExpand" Header="{Binding .}" Footer="{Binding .}" 
                  ItemsSource="{Binding Pins}" CachingStrategy="RecycleElement"
            SeparatorVisibility="Default"
            
            HasUnevenRows="True">
                    <ListView.HeaderTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="8*"></RowDefinition>
                                    <RowDefinition Height="2*"></RowDefinition>
                                </Grid.RowDefinitions>
                                <Image HeightRequest="200" Grid.Row="0" Source="carousel3.jpg" Aspect="AspectFill"></Image>
                                <StackLayout Grid.Row="1">
                                    <Label Text="OUR SELECTION OF PIES" Style="{StaticResource PageHeaderStyle}" HorizontalOptions="CenterAndExpand"></Label>
                                </StackLayout>
                            </Grid>
                        </DataTemplate>
                    </ListView.HeaderTemplate>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Grid Margin="5" BackgroundColor="White" RowSpacing="2" HeightRequest="60">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"></RowDefinition>
                                        <RowDefinition Height="*"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="50"></ColumnDefinition>
                                        <ColumnDefinition Width="*"></ColumnDefinition>
                                        <ColumnDefinition Width="60"></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <!--<Image Grid.Row="0" Grid.RowSpan="2" HeightRequest="80" WidthRequest="100" VerticalOptions="Start" Margin="2,2,1,2" Source="{Binding ImageUrl}"></Image>-->
                                    <StackLayout Grid.Row="0" Grid.Column="1">
                                        <Label  Text="{Binding Address}" Margin="3" Style="{StaticResource PieTileNameStyle}" LineBreakMode="WordWrap"></Label>
                                    </StackLayout>
                                    <!--<Label Grid.Row="0" Grid.Column="2"  Margin="3" Text="{Binding Price, Converter={StaticResource LocalCurrencyConverter}}" Style="{StaticResource PieTilePriceStyle}" HorizontalTextAlignment="End"></Label>-->
                                    <StackLayout Grid.Column="1" Grid.Row="1">
                                        <Label  Margin="3" Grid.ColumnSpan="2" Text="{Binding Label}" Style="{StaticResource PieTileDescriptionStyle}"></Label>
                                    </StackLayout>
                                </Grid>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>

                </ListView>
            </Grid>


            <maps:Map VerticalOptions="FillAndExpand"
                      MyLocationEnabled="True"
                      MapType="Hybrid">
                <maps:Map.Behaviors>
                    <bindings:BindingVisibleRegionBehavior Value="{Binding VisbleRegion}"/>
                    <bindings:MoveToRegionBehavior Request="{Binding MoveToRegionRequest}"/>
                    <bindings:BindingPolygonsBehavior Value="{Binding NogoZones}"/>
                    <bindings:BindingPinsBehavior Value="{Binding Pins}" />
                    <bindings:MapClickedToCommandBehavior Command="{Binding MapClickedCommand}"/>
                </maps:Map.Behaviors>

            </maps:Map>


        </StackLayout>
    </ContentPage.Content>
</ContentPage>

非常感谢任何帮助或建议

【问题讨论】:

  • 您使用的是哪个版本的 Xamarin.Forms.GoogleMaps nuget 包??

标签: c# google-maps xaml xamarin xamarin.android


【解决方案1】:

您需要先初始化ObservableCollection&lt;Pin&gt;,然后才能向其添加引脚。创建一个构造函数并初始化ObservableCollection&lt;Pin&gt;,然后将引脚添加到该集合中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2021-07-07
    • 2015-01-25
    相关资源
    最近更新 更多