Solved! Go to Solution.
using System;
using System.ComponentModel.Composition;
using System.Windows.Interactivity;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Extensibility;
namespace IndentifyFix.AddIns
{
[Export(typeof(Behavior<Map>))]
[DisplayName("IdentifyFix")]
[ESRI.ArcGIS.Client.Extensibility.Category("TEP Tools")]
[ESRI.ArcGIS.Client.Extensibility.Description("Fix the identify tool so that it only hits the visible layers")]
public class IdentifyVisible : Behavior<Map>
{
#region Behavior Overrides
protected override void OnAttached()
{
base.OnAttached();
MapApplication.Current.Initialized += new EventHandler(Current_Initialized);
MapApplication.Current.Map.Layers.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Layers_CollectionChanged);
}
#endregion
void Current_Initialized(object sender, EventArgs e)
{
AddEventHandlers();
MapApplication.Current.Initialized -= new EventHandler(Current_Initialized);
}
private void AddEventHandlers()
{
foreach (Layer layer in MapApplication.Current.Map.Layers)
{
if ((layer as ArcGISDynamicMapServiceLayer) != null)
{
ArcGISDynamicMapServiceLayer agsDynamicLayer = (layer as ArcGISDynamicMapServiceLayer);
agsDynamicLayer.VisibilityChanged += new EventHandler<EventArgs>(ArcGISDynamicMapServiceLayer_VisibilityChanged);
UpdateIndentify(agsDynamicLayer);
}
}
}
private void Layers_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
foreach (var item in e.NewItems)
{
if (item is ArcGISDynamicMapServiceLayer)
{
ArcGISDynamicMapServiceLayer agsDynamicLayer = (item as ArcGISDynamicMapServiceLayer);
agsDynamicLayer.VisibilityChanged += new EventHandler<EventArgs>(ArcGISDynamicMapServiceLayer_VisibilityChanged);
UpdateIndentify(agsDynamicLayer);
agsDynamicLayer.VisibilityChanged += new EventHandler<EventArgs>(ArcGISDynamicMapServiceLayer_VisibilityChanged);
}
}
}
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
foreach (var item in e.OldItems)
{
if (item is ArcGISDynamicMapServiceLayer)
{
(item as ArcGISDynamicMapServiceLayer).VisibilityChanged -= new EventHandler<EventArgs>(ArcGISDynamicMapServiceLayer_VisibilityChanged);
}
}
}
}
void ArcGISDynamicMapServiceLayer_VisibilityChanged(object sender, EventArgs e)
{
ArcGISDynamicMapServiceLayer agsDynamicLayer = sender as ArcGISDynamicMapServiceLayer;
UpdateIndentify(agsDynamicLayer);
}
private static void UpdateIndentify(ArcGISDynamicMapServiceLayer agsDynamicLayer)
{
if (agsDynamicLayer != null)
{
System.Collections.ObjectModel.Collection<int> visibleLayers = new System.Collections.ObjectModel.Collection<int>();
if (agsDynamicLayer.VisibleLayers != null)
{
foreach (var i in agsDynamicLayer.VisibleLayers)
{
visibleLayers.Add(i);
}
}
else
{
foreach (var li in agsDynamicLayer.Layers)
{
if (li.DefaultVisibility == true)
visibleLayers.Add(li.ID);
}
}
ESRI.ArcGIS.Mapping.Core.LayerExtensions.SetIdentifyLayerIds(agsDynamicLayer as Layer, visibleLayers);
}
}
}
}