ThinkGeo.com    |     Blog    |     Wiki    |     Support

Z-index for markers

Hi All,


I can't seem to get the z-index propery of markers in a SimpleMarkerOverlay to work. I have two of those overlays, actually, and it seems that regardless of what order they're in on the map's overlays,or what the z-index of the markers is, the markers from the last overlay added are always on top, and changing the layer order doesn't seem to matter. Is there a way to get this to work? Thanks a lot!


-Dustin



Hi Dustin,


You can override the SimpleMarkerOverlay to acheive this, here the code,



    public partial class DisplayASimpleMap : UserControl
    {
        public DisplayASimpleMap()
        {
            InitializeComponent();
        }

        void DisplayASimpleMap_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;

            MyMarkerOverlay overlay = new MyMarkerOverlay();
            overlay.Markers.Add(new Marker(0, 0) { ImageRotationAngle = 30 });
            MyMarkerOverlay overlay1 = new MyMarkerOverlay();
            overlay1.Markers.Add(new Marker(0, 0));
            Map1.Overlays.Add(overlay);
            Map1.Overlays.Add(overlay1);
            overlay1.ZIndex = 101;
            overlay.ZIndex = 100;

            Map1.CurrentExtent = new RectangleShape(-135.7, 83.6, 113.5, -53);
        }
    }

    class MyMarkerOverlay : SimpleMarkerOverlay
    {
        private int zIndex;

        public new int ZIndex
        {
            get { return zIndex; }
            set { zIndex = value; }
        }

        protected override void DrawCore(RectangleShape worldExtent)
        {
            base.DrawCore(worldExtent);
            Canvas canvas = ((Canvas)OverlayElement);
            canvas.SetValue(Canvas.ZIndexProperty, zIndex);
        }
    }

The ZIndex will work properly in this way.


Regards,


Edgar



Edgar, 
 I’m afraid this doesn’t solve the issue. In your example, you are adding ‘overlay’ first and giving it a lower z-index, which defaults it to the bottom. I am trying to add the layer first, and give it a higherz-index, so that the markers in that layer may lie on top of those in ‘overlay1’. So, to do that, I should be able to simply switch the z-indexes on overlay1 and overlay (so overlay.zIndex = 101 and overlay1.zIndex = 100), but that doesn’t seem to do anything. I hope that makes sense, anyway… that was a whole lot of ‘overlays’.  
 -Dustin

Hi Dustin
 
With the code I posted When:
            overlay1.ZIndex = 100;
            overlay.ZIndex = 101; 
you can see the marker in overlay is on the top of the markers in overlay1
 

With the code I posted When:
            overlay1.ZIndex = 101;
            overlay.ZIndex = 100; 
you can see the marker in overlay1 is on the top of the markers in overlay
 
   
Would you please tell us if this is the effect your want?
 
Hope it helps.
 
Edgar
 

Well don’t I feel sheepish. I had the base.DrawCore() at the end of my custom layer instead of the beginning, and that seems to be what’s making the difference. In my head, I needed to set the Z-index BEFORE the draw took place. Thanks Edgar, you’re a champ.

Alright, here’s a follow-up question. How do I use the MouseEnter and MouseLeave events when using this method? I’m not familiar enough with the DrawCore stuff to actually deduce this myself, I’m afraid, and overriding the OnMouseEnter of the SimpleMarkerOverlay doesn’t seem to do anything either . So, it would instead be like the following, I would think, but haven’t been able to get it to work.  
  
 
void DisplayASimpleMap_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;

            MyMarkerOverlay overlay = new MyMarkerOverlay();
            overlay.Markers.Add(new Marker(0, 0) { ImageRotationAngle = 30 });
            MyMarkerOverlay overlay1 = new MyMarkerOverlay();
            Marker m = new Marker(0, 0);
            m.MouseEnter += new MouseEventHandler(m_MouseEnter);
            overlay1.Markers.Add(m);
            Map1.Overlays.Add(overlay);
            Map1.Overlays.Add(overlay1);
            overlay1.ZIndex = 101;
            overlay.ZIndex = 100;

            Map1.CurrentExtent = new RectangleShape(-135.7, 83.6, 113.5, -53);
}

   void m_MouseEnter(object sender, MouseEventArgs e)
        {
            Marker m = sender as Marker;
            m.ImageRotationAngle = 60;
        }
 


Hi Dustin,
 
We tested our code which is based on your code and we found that m_MouseEnter can be fired, would you please give it a double check?
 
Here is the code we tested:

void DisplayASimpleMap_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;

            MyMarkerOverlay overlay1 = new MyMarkerOverlay();
            Marker m = new Marker(0, 0);
            m.MouseEnter += new MouseEventHandler(m_MouseEnter);
            overlay1.Markers.Add(m);
            Map1.Overlays.Add(overlay1);
            Map1.CurrentExtent = new RectangleShape(-135.7, 83.6, 113.5, -53);
        }

        void m_MouseEnter(object sender, MouseEventArgs e)
        {
            Marker m = sender as Marker;
            m.ImageRotationAngle +=20 ;
        }


 
When the mouse entered the marker again and again, its angle changed again and again.
Regards,
Edgar

Hi Edgar, 
 Thanks for entertaining this. What you have is essentially what I have, just with a single layer, but even copying your code directly doesn’t seem to work. The event never fires for me. It doesn’t look like any of the marker events fire, for that matter, while the Map events DO still fire (Click, Double click, etc) For whatever it’s worth, I’m using v6.0.0.247 of the eval edition. I have even created a brand new clean project to test this out, and no joy there, either. Not really sure what’s going on here, this time. Normally it’s just something silly that I overlooked.

That is weird, could you please send your sample to us to have a test? You can send it to forumsupport@thinkgeo.com
  
 Regards, 
 Edgar

Most certainly. I just sent the whole solution over to you.

Dustin, 
  
 Sorry for the inconvenience, we’ve fixed this bug and please get the 6.0.0.255 or 6.0.255.0 and have a try. 
  
 Regards,  
 Edgar

Thanks so much, Edgar! Works like a charm! You guys are the best.

You’re welcome Dustin, if you have any other questions, please let us know. 
  
 Regards, 
 Edgar