ThinkGeo.com    |     Documentation    |     Premium Support

Mouse events and tooltip on overlay element not working

Hi Team,


We are using mapsuite silverlight edition 3.0 for our development and need your help.



LayerOverlay



 Overlay = new LayerOverlay();



Overlay.OverlayElement.MouseEnter +=


 


Overlay.OverlayElement.AttachRightClick(ClickCamera);


new MouseEventHandler(OverlayElement_MouseEnter);ToolTipService.SetToolTip(Overlay.OverlayElement, "hhjg");


All the above events on the overlay element is not firing. If this is not the right way then how can we add mouse events, right click event and tooltip set for a feature element added to a overlay? While evaluating the mapsuite version we tried using these events on a simplemarkeroverlay and these events worked fine. Now we are using layeroverlay for keeping things generic and to use value style. Please get back to us on this asap.  


Thanks,


Krithika



I see that you have another post on SilverLight "Stretching Map Control nor working". On this one, I am going to ask you the same thing. Can you please send us a little sample app so that we can see the problem happening and we will look at it to fix i? Thank you.

Hi Val, 
  
 Thanks for supporting us. 
  
 Currently in our project we are handling the mouse event on a feature re in the following way: 
 1. Attach any mouse event on the map. 
 2. On event firing, check if the mouse event happened on the map where a feature exists and get that particular feature object. 
  
 In this approach we are not able to get the overlay or layer object on which the mouse event was fired. 
  
 We want to handle these mouse events seperately for each overlay element (instead of adding it directly on the map) added to the overlay. 
 This event is existing but is not being fired based on the mouse operations. 
 Note: In our application every feature exists in a layer overlay.    
  
 Ex: 
 

LayerOverlay Overlay = new LayerOverlay();
Overlay.OverlayElement.MouseEnter += new MouseEventHandler(OverlayElement_MouseEnter);
 
 
  
 We shall try to send a sample application through the support@thinkgeo.com. Meanwhile you can have a look at this mail to see if you can get any clues. Or it would be great if you can try what i mentioned here. 
  
 Can we have a call to discuss the problems we are facing as we are in tough project deadlines? We are in GMT + 5:30 time. 
  
 Thanks, 
 Krithika

Thank you for your additional explanations. I will have the SilverLight team work directly on your case this afternoon. So you should have the solution at the latest tomorrow morning. Of course, if you can send a sample application that will help. If you still have problems, we can arrange a phone call.

Hi Krithika,



From your description, I guess you want to implement the tooltips on LayerOverlay. Your idea is pretty good but in Silverlight Edition, it’s not the way to do that.



Let’s say Silverlight map is formed with several overlays such as LayerOverlay, MarkerOverlay and ServerLayerOverlay. Every overlay has an order which is Z-Index in the DOM tree.



In your code, you set the mouse event on one overlay but it may be blocked by another canvas which has higher Z-Index on the map, so the event might not be raised.



Normally, to implement this feature, we usually find the mouse position and convert to the world coordinate in the mouse move event on the map; then use query tool to find the features which are containing the mouse world coordinates; then add a popup to represent the tooltip contents.



Here attaches a demo for you; hope it helps.



Please let me know if you have any queries.



Thanks, 

Howard 

 



FeatureInfo.zip (18.6 KB)

Hi,


 


Thanks for your reply.


We are also doing things the similar way as you had explained. But in your sample you have only one overlay and so you know which overlay to query for the feature. But in our application there are many overlays and many features in each overlay. Is there any way to know on which overlay the event was fired.


This would be of great help!!


Thanks,


Krithika



Hi Krithika,



Currently, we don't know which overlay or layer is fired on the event. But we can simply loop the overlays and layers in the map and find the first feature we looped and then raise the event. This event is not actually on the overlay or layer. It’s a general event on the map. 



Please consider one scenario, when you have several overlays, then mouse hovers on the map. One mouse coordinate may be contained by many features in different overlay. The code below is a rewrote method in my attached sample above which helps to find features that are containing the mouse coordinates; please replace the old one. 

private void hoverTimer_Tick(object sender, System.EventArgs e)
{
    Collection<Feature> queriedFeatures = new Collection<Feature>();

    // Loop all the overlays.
    foreach (Overlay overlay in Map1.Overlays)
    {
        // Find LayerOverlays in the map.
        LayerOverlay layerOverlay = overlay as LayerOverlay;
        if (layerOverlay != null)
        {
            // Loop all the layers and get all the FeatureLayers.
            foreach (Layer layer in layerOverlay.Layers)
            {
                FeatureLayer featureLayer = layer as FeatureLayer;
                if (featureLayer != null)
                {
                    // Query feature layers and get the features which are containing the mouse world coordinate.
                    featureLayer.Open();
                    Collection<Feature> features = featureLayer.QueryTools.GetFeaturesContaining(mouseWorldPosition, ReturningColumnsType.AllColumns);
                    featureLayer.Close();

                    foreach (Feature feature in features)
                    {
                        // Consider your scenario;
                        // We can collect all features which are containing the mouse world coordinate;
                        // or we can break here and only get the latest one.
                        queriedFeatures.Add(feature);
                    }
                }
            }
        }
    }

    if (queriedFeatures.Count > 0)
    {
        if (Map1.Popups.Count != 0) { Map1.Popups.Clear(); }

        Feature feature = queriedFeatures[0];
        string content = String.Format(CultureInfo.InvariantCulture, "Tips:{0}", feature.ColumnValues["Tips"]);
        GeoPopup popup = GetPopup(content, mouseWorldPosition);
        Map1.Popups.Add(popup);
    }
    else if (Map1.Popups.Count != 0) { Map1.Popups.Clear(); }

    hoverTimer.Stop();
}

Please feel free to modify it to meet your requirement and let me know how it works.



Thanks,

Howard