Solved! Go to Solution.
private void RemoveAcceleratedLayer(ESRI.ArcGIS.Client.Layer layer)
{
ESRI.ArcGIS.Client.GroupLayerBase container = Container(layer);
if (container != null)
RemoveAcceleratedLayer(layer, container);
else
MyMap.Layers.Remove(layer);
}
void RemoveAcceleratedLayer(ESRI.ArcGIS.Client.Layer layer, ESRI.ArcGIS.Client.GroupLayerBase gl)
{
System.Type Tds = layer.GetType().Assembly.GetType("ESRI.ArcGIS.Client.DrawingSurface");
var field = Tds.GetField("NativeLayerProperty", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
var dependencyProperty = (DependencyProperty)field.GetValue(null);
var nativelayer = layer.GetValue(dependencyProperty);
var lockprop = nativelayer.GetType().GetProperty("Lock", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var lockobj = lockprop.GetValue(nativelayer, null);
using (lockobj as System.IDisposable)
gl.ChildLayers.Remove(layer);
}
ESRI.ArcGIS.Client.GroupLayerBase Container(ESRI.ArcGIS.Client.Layer layer)
{
return AllLayers(MyMap.Layers).OfType<ESRI.ArcGIS.Client.GroupLayerBase>().FirstOrDefault(gl => gl.ChildLayers.Contains(layer));
}
System.Collections.Generic.IEnumerable<ESRI.ArcGIS.Client.Layer> AllLayers(System.Collections.Generic.IEnumerable<ESRI.ArcGIS.Client.Layer> layers)
{
return layers.Concat(layers.OfType<ESRI.ArcGIS.Client.GroupLayerBase>().SelectMany(glb => AllLayers(glb.ChildLayers)));
}
private void HandleUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
if ( e.Exception is TargetInvocationException &&
e.Exception.InnerException is NullReferenceException &&
e.Exception.InnerException.StackTrace.Contains("DrawingSurface"))
e.Handled = true;
}
Application.Current.DispatcherUnhandledException += HandleUnhandledException;