如何从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();
}
你在想什么?
如果您进行了映射。清除它将删除地图上的所有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);
}