ThinkGeo.com    |     Documentation    |     Premium Support

Dynamically disable individual styles in a layer

I’ve got a variety of layers in several overlays.  These layers use a variety of standard and custom styles, along with some layers using ValueItem to provide differential styles for a given style type based on associated data.  My problem is that at runtime I need to be able to efficiently make the items represented by these styles visible or not visible based on user input.  For example, this may be on a layer that has a Point style and a Text style; and the user will want to show only one or the other, or both.  It may also be a collection of Point styles represented by ValueItem to differentiate colors (etc), and the user wants to see some subset.  Unfortunately, I can find no way to enable/disable individual styles on a layer.  I’m afraid the only answer will be to remove/add the styles as required.



For a reference example of the functionality I’m trying to implement, you can look at the old pre-3.0 “Legend” that was then provided for your map, but is now missing.

Hi Russ, 
  
 You can find the target style, then set it’s IsActive equal false to hide it. As below is my test code based on our FindTheFeatureAUserClickedOn sample: 
  
  

private void SelectFeatures_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"…\SampleData\Data\Countries02.shp");
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle(“CNTRY_NAME”, “Arial”, 10, DrawingFontStyles.Regular, GeoColor.StandardColors.Red, 0, -12);
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;           
            
            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add(“WorldLayer”, worldLayer);
            winformsMap1.Overlays.Add(staticOverlay);

            winformsMap1.MapClick += new EventHandler<MapClickWinformsMapEventArgs>(winformsMap1_MapClick);

            winformsMap1.CurrentExtent = new RectangleShape(-139.2, 92.4, 120.9, -93.2);
            winformsMap1.Refresh();
        }

        void winformsMap1_MapClick(object sender, MapClickWinformsMapEventArgs e)
        {
            ShapeFileFeatureLayer worldLayer = (winformsMap1.Overlays[0] as LayerOverlay).Layers[0] as ShapeFileFeatureLayer;
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.IsActive = false;
            winformsMap1.Refresh();
        }
 
  
 Wish that’s helpful. 
  
 Regards, 
  
 Don

Ah, thanks.  I can’t believe I was looking for something that might do what I need, and somehow I didn’t even see that property…

Hi Russ, 
  
 I am glad that works for you, any question please let us know. 
  
 Regards, 
  
 Don

Today I got a chance to try to implement this, and as far as I can tell, it does not work. 



The simplest case is a standard shape file layer that has text associated with it.  The shape type may be area, line or point; it does not matter.  But the shape layer also has DefaultTextStyle set using TextStyles.CreateSimpleTextStyle.  I can show/hide the layer without issue.  But the text style is always active when the layer is visible.  When I set IsActive to false on the TextStyle, I can see it take the value in the debugger, but it doesn’t make any difference and continues to draw the text for the layer.   



In my desired implementation, I stash the layer and style in a checked tree node for the user to interact with (again, recreating the old legend control).  These are kept up with from the initial load of the layers.  I first attempted to just set IsActive on the stashed Style that was originally assigned to a zoom level and then ranged with ApplyUntilZoomLevel.  Based on my expectation of how that worked, I thought this would work, but it didn’t. 



In the end I even added code to go back and find the initial zoom level on the layer where the style was set. Using that same zoom level, I set the DefaultTextStyle IsActive on it to false, and then reapply the ApplyUntilZoomLevel on that.  This is in thinking that there is some side-effect in ApplyUntilZoomLevel such that simply setting IsActive on that didn’t affect the style instances actually being used.  Still there is no effect. 



I haven’t even begun to look at the more complicated aspect of using the ValueItem based styles, but these will have to also support user visibility selection. It appears that there is nothing virtual/extensible about ValueItem, which means my only recourse will be to use IsActive on those styles as well.

  

What am I missing?  Or does it simply not work?

Never mind, I figured out what I was missing, sorry for the noise…

Hi Russ, 
  
 Don’t worry about that, any question please let us know. 
  
 Regards, 
  
 Don