Xaml 在地图上显示图钉

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

我很难将图钉添加到以我喜欢的方式工作的地图中

首先,我尝试添加MapItemsControl并将其绑定

<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,你有什么新的补充吗?注意到同样的效果。