在XAML中绑定MapIcon

5

我想使用MapControl,在其中显示当前查看位置的MapIcon。

在我的XAML中,我已经有了:

<Maps:MapControl x:Name="MapControl" ZoomLevel="14" Center="{Binding Geopoint, Mode=OneWay}" Margin="-12,0,-12,0" Tapped="directions_Click" Height="200" MapServiceToken="{StaticResource BingMapsKey}" PanInteractionMode="Disabled" RotateInteractionMode="Disabled">
    <Maps:MapIcon Location="{Binding Geopoint}" Title="{Binding AttractionName}" />
</Maps:MapControl>

我绑定的项在页面上的其他位置使用(例如,地图以正确位置为中心),但MapIcon未显示,也没有任何提示原因?
据我所见来自MSDN,我应该能够以这种方式绑定(尽管特别针对<MapIcon>的示例是动态添加它们,但它确实显示了其他XAML对象直接在XAML中绑定)。我在这里标记XAML是否有误?

MapElements默认情况下无法绑定到代码。但是,您可以尝试使用伟大的扩展WpWinNlMaps,它由行为组成,允许绑定。 - sibbl
3个回答

2

我最终通过 XAML 构建了自己的推针:

 <Maps:MapControl x:Name="MapControl" ZoomLevel="14" Center="{Binding Geopoint, Mode=OneWay}" Margin="-12,0,-12,0" Tapped="directions_Click" Height="200" MapServiceToken="{StaticResource BingMapsKey}" PanInteractionMode="Disabled" RotateInteractionMode="Disabled">
     <Grid HorizontalAlignment="Left" Maps:MapControl.Location="{Binding Geopoint}" Maps:MapControl.NormalizedAnchorPoint="0,1">
         <Grid.RowDefinitions>
             <RowDefinition Height="*" />
             <RowDefinition Height="*" />
         </Grid.RowDefinitions>

         <Border Background="{ThemeResource SystemControlBackgroundAccentBrush}" Grid.Row="0">
             <TextBlock Text="{Binding AttractionName}" HorizontalAlignment="Left" />
         </Border>
         <Polygon Points="0,0 12.5,0 0,20" Fill="{ThemeResource SystemControlBackgroundAccentBrush}" StrokeThickness="0" Grid.Row="1" />
     </Grid>
 </Maps:MapControl>

这样可以通过绑定位置(通过Maps:MapControl.Location="{Binding Geopoint}")来绑定位置,并且可以设置相对位置,以便点保持在正确的位置(通过Maps:MapControl.NormalizedAnchorPoint="0,1" - 即针内容的左下角)。
虽然这不是使用MapIcon,但这为我们的应用程序显示Windows Phone 7.x / 8.x中的位置提供了外观和感觉,因此可能对其他希望获得类似效果的人有所帮助。

当我尝试在我的UWP项目中使用此解决方案来解决完全相同的问题时,我遇到了以下错误:“System.AccessViolationException:'尝试读取或写入受保护的内存。这通常是其他内存已损坏的迹象。”我尝试了几个建议的解决方案来消除此异常,但没有成功。你有什么建议吗? - Vrankela

2
正如您提到的,LocationTitle可以绑定到GeopointAttractionName。但是要在地图控件上显示MapIcon,我们需要通过编程将MapIcon添加到其MapElements集合中。
例如:
MapControlLoaded事件中。
private void MapControl_Loaded(object sender, RoutedEventArgs e)
{
    MapControl.MapElements.Add(MyMapIcon);
}

在此输入图片描述

这之后,MapIcon 就可以像上面的图片一样显示在 MapControl 上。但是你会发现,在 MapControl 的左上角有一个类名的字符串。

这是因为你将 MapIcon 作为 MapControl 的隐式子元素添加进去了。这相当于在 XAML 代码中像下面这样将 MapIcon 添加到 MapItemsControl 中。

<Maps:MapControl x:Name="MapControl" ZoomLevel="14" Center="{Binding Geopoint, Mode=OneWay}" Margin="-12,0,-12,0"  Height="200" PanInteractionMode="Disabled" RotateInteractionMode="Disabled"   Loaded="MapControl_Loaded">
    <Maps:MapItemsControl>
        <Maps:MapIcon x:Name="MyMapIcon" Location="{Binding Geopoint}" Title="{Binding AttractionName}" />
    </Maps:MapItemsControl>
</Maps:MapControl>

MapItemsControl可以通过将XAML用户界面元素(如Button、HyperlinkButton或TextBlock)作为MapControl的子项添加来显示它们。MapIcon不能在MapControl上显示,因此它会显示其类名。

作为解决方法,我们可以将MapIcon放在Resources中来解决这个问题。 例如:

<Page.Resources>
    <Maps:MapIcon x:Name="MyMapIcon" Location="{Binding Geopoint}" Title="{Binding AttractionName}" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Maps:MapControl x:Name="MapControl" ZoomLevel="14" Center="{Binding Geopoint, Mode=OneWay}" Margin="-12,0,-12,0" Tapped="directions_Click" Height="200" MapServiceToken="{StaticResource BingMapsKey}" PanInteractionMode="Disabled" RotateInteractionMode="Disabled" Loaded="MapControl_Loaded">
    </Maps:MapControl>
</Grid>

1
我在UWP中也遇到了类似的问题,我的解决方法是将MapControl作为ItemsControl使用,并显示一个元素集合。以下代码仅显示一个图像,但您可以将DataTemplate的内容包装在Grid中,例如显示ImageTextBlock。请保留html标签。
    <Maps:MapControl>                        
        <Maps:MapItemsControl x:Name="MapItems" ItemSource="{Binding Items}">
            <Maps:MapItemsControl.ItemTemplate>
                <DataTemplate x:DataType="m:model">
                    <Image Source="{x:Bind ImgSource}" Maps:MapControl.Location="{x:Bind Location}" Width="50" Height="50" Margin="-25,-50,0,0" />
                </DataTemplate>
            </Maps:MapItemsControl.ItemTemplate>
        </Maps:MapItemsControl>
    </Maps:MapControl>

希望这有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接