之前对栅格图层拉伸渲染后图例不能更新的问题做了深入的探索和研究,虽然找到了解决办法,但是感觉还是和ArcMap的处理方式有差异,因为ArcMap做相同处理后其图例项的符号转换为IColorRampSymbol后,LegendClassIndex属性都是0。因为偶然的一瞥,发现RasterStretchColorRampRendererClass实现了IRasterRendererColorRamp接口,这个接口引起我的注意。实验发现,使用IRasterStretchColorRampRenderer接口的ColorRamp属性修改色带后图例不能自动更新,而如果转换为IRasterRendererColorRamp接口,然后使用IRasterRendererColorRamp接口的ColorRamp修改色带,图例就可以自动更新了。综上所述,对前一篇的研究结果做一下修正,以下是完整代码:
IRasterLayer pRasterLayer = wndMap.CustomProperty as IRasterLayer;
IRasterRenderer pRasterRender = pRasterLayer.Renderer;
IRasterRenderer pNewRasterRender = null;
IRgbColor pFromColor = new RgbColorClass();
pFromColor.RGB = 0xffffff;
IRgbColor pToColor = new RgbColorClass();
pToColor.RGB = 0x000000;
IAlgorithmicColorRamp pAlgorithmColorRamp = new AlgorithmicColorRampClass();
pAlgorithmColorRamp.Size = 256;
pAlgorithmColorRamp.FromColor = pFromColor;
pAlgorithmColorRamp.ToColor = pToColor;
bool bColorRampCreated = false;
pAlgorithmColorRamp.CreateRamp(out bColorRampCreated);
IRasterStretchColorRampRenderer pRasterStretchColorRamp = new RasterStretchColorRampRendererClass();
pNewRasterRender = pRasterStretchColorRamp as IRasterRenderer;
pNewRasterRender.Raster = pRasterLayer.Raster;
pRasterStretchColorRamp.BandIndex = 0;
IRasterStretch pRasterStretch = pNewRasterRender as IRasterStretch;
pRasterStretch.StretchType = esriRasterStretchTypesEnum.esriRasterStretch_MinimumMaximum;
//应该使用IRasterRendererColorRamp的ColorRamp修改色阶,不要用IRasterStretchColorRampRenderer的ColorRamp修改色阶
//否则图例不能自动更新
IRasterRendererColorRamp pRasterRendererColorRamp = pRasterStretchColorRamp as IRasterRendererColorRamp;
pRasterRendererColorRamp.ColorRamp = pAlgorithmColorRamp as IColorRamp;
pNewRasterRender.Update();
pRasterLayer.Renderer = pNewRasterRender;