如何从Bing地图上动态创建的MapLayers中清除图钉

本文关键字:MapLayers 清除 创建 动态 Bing 地图 | 更新日期: 2023-09-27 18:29:43

我有这个代码:

DataLayer.Children.Clear();

它从设计时的MapLayer中删除了图钉,声明如下:

<bm:Map Credentials="CuellarDobsonMcNallyPalmer420s" x:Name="photraxMap" Margin="0,0,0,0" >
    <bm:Map.Children>
        <!-- Data Layer-->
        <bm:MapLayer Name="DataLayer"/>
        . . .

但我也通过编程创建了额外的MapLayers:

MapLayer mapLayerToUse = DataLayer;
if (Cre8DynamicMapLayer)
{
    mapLayerToUse = new MapLayer();
    mapLayerToUse.Name = String.Empty;
    photraxMap.Children.Insert(0, mapLayerToUse);
}

那么我怎样才能清除这些动态创建的MapLayers呢?

我可以做一些相关的事情,比如给动态映射层随机命名,将它们存储在列表中,然后在该列表上迭代,调用Children。清除它们(在找到具有该名称的MapLayer之后),但我想肯定有一种更简单、更优雅的方法。有人知道吗?

更新

尼古拉斯,是这样的:

// App.xaml.cs
sealed partial class App : Application
{
    public static List<MapLayer> dynamicMapLayers  { get; set; } 
    . . .
    protected override void OnLaunched(LaunchActivatedEventArgs e)
    {
     . . .
        dynamicMapLayers = new List<MapLayer>();
//MainPage.xaml.cs (update of previously shown code):
MapLayer mapLayerToUse = DataLayer;
if (Cre8DynamicMapLayer)
{
    mapLayerToUse = new MapLayer();
    mapLayerToUse.Name = String.Empty;
    dynamicMapLayers.Add(mapLayerToUse); // <= this is the new line
    photraxMap.Children.Insert(0, mapLayerToUse);
}
// Finally, insted of doing all that looping as shown in my proposed answer, simply do this instead:
foreach (MapLayer ml in dynamicMapLayers)
{
    ml.Children.Clear();
}

你在想什么?

如何从Bing地图上动态创建的MapLayers中清除图钉

如果您进行了映射。清除它将删除地图上的所有MapLayers,包括动态添加的MapLayers。如果你想清除每个MapLayer,而不删除它,那么你必须递归地循环浏览MapLayer中的所有项目,并检查一个项目是否是MapLayer,因为MapLayers可以有子MapLayers。如果一个项不是MapLayer,则删除它;如果是,则递归地遍历子MapLayer。

我希望有一些非常简洁的东西,但可能我最终不得不做这样的事情:

// Adapted the following from http://www.codeease.com/only-remove-pushpins-from-a-layer-in-bing-map.html
private void ClearPushpins()
{
    List<UIElement> elementsToRemove = new List<UIElement>();
    List<UIElement> pushpinToRemove = new List<UIElement>();
    foreach (String photoset in App.CurrentlyMappedPhotosets)
    {
        foreach (UIElement element in photraxMap.Children)
        {
            if (element.GetType() == typeof(MapLayer))
            {
                MapLayer Lay = (MapLayer)element;
                if (Lay.Name == photoset)
                {
                    foreach (UIElement p in Lay.Children)
                    {
                        if (p.GetType() == typeof(Pushpin))
                        {
                            pushpinToRemove.Add(p);
                        }
                    }
                    foreach (UIElement pin in pushpinToRemove)
                    {
                        Lay.Children.Remove(pin);
                    }
                    elementsToRemove.Add(Lay);
                }
            }
            foreach (UIElement e in elementsToRemove)
            {
                photraxMap.Children.Remove(e);
            }
        }
    }
}

您可以使用remove-at函数删除地图图层

   int number_of_layers = map.Layers.Count;        
  for (var i = 0; i < number_of_layers; i++)
                {
                    map.Layers.RemoveAt(0);
                }