Xaml 在地图上显示图钉
我很难将图钉添加到以我喜欢的方式工作的地图中 首先,我尝试添加MapItemsControl并将其绑定Xaml 在地图上显示图钉,xaml,windows-phone-8.1,Xaml,Windows Phone 8.1,我很难将图钉添加到以我喜欢的方式工作的地图中 首先,我尝试添加MapItemsControl并将其绑定 <map:MapItemsControl ItemsSource="{Binding Path=Locations}"> <map:MapItemsControl.ItemTemplate> <DataTemplate> <controls:NumberedCircle Number="{Binding
<map:MapItemsControl ItemsSource="{Binding Path=Locations}">
<map:MapItemsControl.ItemTemplate>
<DataTemplate>
<controls:NumberedCircle Number="{Binding Path=Number}" map:MapControl.Location="{Binding Path=Point}"/>
</DataTemplate>
</map:MapItemsControl.ItemTemplate>
</map:MapItemsControl>
这很有效。我平移地图,无论我移动多快,MapIcon都会准确地停留在它应该在的位置。一点也不拖拉。但是--当您放大和缩小时,MapIcon会出现和消失,如文档中所述:
不保证显示MapIcon。它可能被隐藏,当它
遮挡地图上的其他元素或标签
我很沮丧,因为我有两种方法可以在地图上添加图钉,它们都会因为不同的原因造成糟糕的用户体验。因此,问题是:
1) 我遗漏了什么吗?有没有办法使XAML元素不滞后于pan?有没有办法使MapIcons始终可见
2) 有没有一种方法可以创建一个行为类似于MapIcon的自定义类?它源于MapElement,但我看不到图钉的实际渲染是如何完成的,也看不到图像、标题等的布局是如何定义的。如果我可以创建自己的MapIcon,我可能会禁用隐藏行为
编辑:在诺基亚925上运行应用程序,效果不太明显(以上视频来自521)。保持XAML覆盖与地图的同步似乎需要大量处理器,在较小的硬件上可能会更糟。这可能是一个很长的过程(也不是很漂亮),但请尝试在UI线程上填充MapItemsControl
为图钉创建一个类:
public class PushpinData
{
public GeoCoordinate Location { get; set; }
public string Text { get; set; }
public SolidColorBrush DisplayBrush { get; set; }
}
xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"
xmlns:maptk="clr-namespace:Microsoft.Phone.Maps.Toolkit;assembly=Microsoft.Phone.Controls.Toolkit"
<maps:Map x:Name="mapControl" >
<maptk:MapExtensions.Children>
<maptk:MapItemsControl x:Name="PushpinLayer">
<maptk:MapItemsControl.ItemTemplate>
<DataTemplate>
<maptk:Pushpin GeoCoordinate="{Binding Location}"
Content="{Binding Text}"
Background="{Binding DisplayBrush}"/>
</DataTemplate>
</maptk:MapItemsControl.ItemTemplate>
</maptk:MapItemsControl>
</maptk:MapExtensions.Children>
</maps:Map>
使用图钉的DataTemplate
创建MapControl
:
public class PushpinData
{
public GeoCoordinate Location { get; set; }
public string Text { get; set; }
public SolidColorBrush DisplayBrush { get; set; }
}
xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"
xmlns:maptk="clr-namespace:Microsoft.Phone.Maps.Toolkit;assembly=Microsoft.Phone.Controls.Toolkit"
<maps:Map x:Name="mapControl" >
<maptk:MapExtensions.Children>
<maptk:MapItemsControl x:Name="PushpinLayer">
<maptk:MapItemsControl.ItemTemplate>
<DataTemplate>
<maptk:Pushpin GeoCoordinate="{Binding Location}"
Content="{Binding Text}"
Background="{Binding DisplayBrush}"/>
</DataTemplate>
</maptk:MapItemsControl.ItemTemplate>
</maptk:MapItemsControl>
</maptk:MapExtensions.Children>
</maps:Map>
一旦有了它,就可以填充
pushpinList
。为了避免破坏MVVM,您当然可以通过Messenger
从您的VM接收图钉列表。还要确保您的图钉集合只包含在任何给定时间显示的图钉。我恐怕要告诉您,除了减少元素数量或图钉的XAML代码的复杂性之外,您对此无能为力
MapIcon和MapElements之间的区别在于,MapIcon是直接发送到map控件并在其中渲染的位图,而MapElements是XAML元素并由XAML线程渲染。延迟是由于映射线程中的映射交互与应用程序的UI线程之间需要同步而导致的
您可以尝试将图钉的XAML作为位图(请参见RenderTargetBitmap)。渲染可能需要一些时间,但您可以将其用于Mapicon。然而,几个月前我尝试过这个方法,却发现没有办法一直显示MAPICON
由于我也在开发一个应用程序,我希望MapIcons始终可见,因此希望将来会对Map组件进行更改。有相当多的错误在地图上,例如,我也不能改变一个推针的锚点。。。MS在这方面可以改进很多
编辑:要了解有关map控件和MapIcons/MapElements/…的更多信息,请查看。谢谢,但是Microsoft.Phone.Maps是WP 8.0的名称空间;我在8.1上,他们(再次)改变了一切。哦。。。我以为你的目标是WP8.1 Silverlight(或者它也不存在了…),你知道我可以从会议上的演讲中找到他们的源代码吗?嗨,Paul,你有什么新的补充吗?注意到同样的效果。