ThinkGeo.com    |     Documentation    |     Premium Support

Exception with message 'Parameter is not valid."

I sometimes encounter this exception just before map draws when I attempt to manually zoom into a certain scale and extent.  What does this error mean?  This is the stack trace.  



12/24/2010 13:52:59


Type : System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089


Message : Parameter is not valid.


Source : System.Drawing


Help link : 


ParamName : 


Data : System.Collections.ListDictionaryInternal


TargetSite : Void .ctor(Int32, Int32, System.Drawing.Imaging.PixelFormat)


Stack Trace :    at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)


   at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)


   at ThinkGeo.MapSuite.WpfDesktopEdition.BackgroundOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType refreshType)


   at ThinkGeo.MapSuite.WpfDesktopEdition.Overlay.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.xdffbdec6f15e90de(Overlay xa02b1470fea9c9a6, RectangleShape x224aab0b7185a66c, OverlayRefreshType xea455b1d2fcd13a5)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.x67118a339906032f(IEnumerable`1 x9ffed0592b3382fa, RectangleShape x224aab0b7185a66c, OverlayRefreshType x2f080d7afcb67ec7)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.x67118a339906032f(RectangleShape x224aab0b7185a66c, OverlayRefreshType x2f080d7afcb67ec7)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.DrawCore(RectangleShape targetExtent, OverlayRefreshType overlayRefreshType)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.x51d3a13ecd447601(RectangleShape x224aab0b7185a66c)


   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.ZoomToScale(Double targetScale)


   at EMS.ThinkGeoLibrary.Controllers.MapMasterController.ZoomToFullExtent() in C:\dev\LUT600 2.1.1\OCC600\Source\GIS\Modules\ThinkGeo\ThinkGeoLibrary\Controllers\MapMasterController.cs:line 832


   at EMS.ThinkGeoLibrary.Controllers.MapMasterController.OnMapInitialized(Object sender, DataEventArgs`1 e) in C:\dev\LUT600 2.1.1\OCC600\Source\GIS\Modules\ThinkGeo\ThinkGeoLibrary\Controllers\MapMasterController.cs:line 1103


TIA.



Hi Klaus, 
  
 I checked the stack trace and I’m sure the issue is caused by the with and height parameter to the bitmap constructor. It might be the with and height of the map is invalid such as -1 or 0. Do you call ZoomToScale method in the Loaded event or the map is absolutely rendered?  I tried to recreate this issue, but failed. Could you try to create a sample to show us how to recreate your issue? 
  
 Thanks, 
 Howard

Howard, I call ZoomToScale in the map Loaded event.  Have tried several tricks on determining when map width and height is not -1 or 0 but with no success so far.  May just ignore exception for now. 
  
 Thanks.

Klaus,


Can you do following test and check the width and height see if they are valid or not?


        private void WpfMap_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;
            Map1.BackgroundOverlay = new CustomBackgroundOverlay();
            Map1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);
            WorldMapKitWmsWpfOverlay worldOverlay = new WorldMapKitWmsWpfOverlay();
            Map1.Overlays.Add("WMK", worldOverlay);
            Map1.Refresh();
        }

    public class CustomBackgroundOverlay : BackgroundOverlay
    {
        protected override void DrawCore(RectangleShape targetExtent, OverlayRefreshType refreshType)
        {
            int width = (int)MapArguments.ActualWidth;
            int height = (int)MapArguments.ActualHeight;
            base.DrawCore(targetExtent, refreshType);
        }
    }

thanks


James



James,  
  
 Replaced WpfMap.BackgroundOverlay with instance of your proposed CustomBackgroundOverlay and MapArguments.ActualWidth and ActualHeight are neither 0 nor -1.  But this seems to have cured the problem.  Was this a proposed fix ?

Klaus, 
  
 The custom backgroundOverlay do the same thing with original one, only additional thing is let you can see width and height, you can remove those two line code and try again, If you can stll run my sample properly, I guess the problem is not at BackgroundOverlay, the reason is your code is incorrect to cause the problem, could you provide a simple sample which can reproduce your problem? 
  
 Thanks 
 James

James, I spoke too fast.  CustomBackgroundOverlay does not get rid of error.  Seems to be an intermittent thing.  Will see if I can determine exactly when this happens and will report back.

Klaus,


OK, let me know when you find, before that I am still curious that the value of the arguenments when the exception throw, so I modify a little bit of code, could you test again and take a screen-shot when the message box show?


public class CustomBackgroundOverlay : BackgroundOverlay
    {
        protected override void DrawCore(RectangleShape targetExtent, OverlayRefreshType refreshType)
        {
            int width = (int)MapArguments.ActualWidth;
            int height = (int)MapArguments.ActualHeight;
try
{
             base.DrawCore(targetExtent, refreshType);
}
catch
{
MessageBox.Show(string.format("width:{0},height:{1},ActualWidth:{2},ActualHeight:{3}", width, height, MapArguments.ActualWidth, MapArguments.ActualHeight);
}
        }
    }

Thanks


James


 



James, as we discovered, exception will be thrown when you attempt to ZoomToScale before map is visible as its height and width may be invalid.  I have put in an additional condition to check that the map is actually visible before calling ZoomToScale.  Result is no more of this exception.  Thanks again.

Klaus, 
  
 You’re so welcome. 
  
 I am glad you fix your problem, let me know if you have more questions. 
  
 Thanks, 
 James

 What check did you use to ensure that the map is visible and of proper height?  I have a similiar issue where my viewmodel initiates a map refresh from a different thread and the map might not be visible (it is a contained tool).



Hello Thomas, 
  
 We have wpfMap1.IsVisible property to check if the map is visible. true if the element is visible; otherwise, false. 
  
 Regards, 
  
 Gary