【发布时间】: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