ThinkGeo.com    |     Documentation    |     Premium Support

No overload problem

Hi,

 




wpfMap1.EditOverlay.FeatureDragged +=


new EventHandler<FeatureDraggedEditInteractiveOverlayEventArgs>(EditOverlay_FeatureDragged);


 The above statement causes: Error: No overload for "EditOverlay_FeatureDragged" matches delegate 'System.EventHandler<ThinkGeo.MapSuite.WpfDesktopEdition.FeatureDraggedEditInteractiveOverlayhEventArgs>'

In this case, what event should be used  if the intention is to save a polygon at the end of "track and edit"?


Thanks.


 


 


 


 


 



Hi Franklin,



I guess, your event handler misses some parameters. Please check if the handler method contains two parameters; One is object sender and another one is the FeatureDraggedEditInteractivOverlayEventArgs. Or you can just remove adding the event handler and use "Tab" key to generate the code automatically.



For your another question, we don't have a EditEnded event. I think we can add this API in the near future. We are preparing our main release next month, so we have freezed our APIs for now. Here is a workaround for you. Use this EditOverlay instead providing you an EditEnded event.

public class CustomEditInteractiveOverlay : EditInteractiveOverlay
{
    public event EventHandler<EditEndedEditInteractiveOverlayEventArgs> EditEnded;

    public CustomEditInteractiveOverlay()
    { }

    protected override void EndEditingCore(PointShape targetPointShape)
    {
        base.EndEditingCore(targetPointShape);
        OnEditEnded(new EditEndedEditInteractiveOverlayEventArgs());
    }

    protected virtual void OnEditEnded(EditEndedEditInteractiveOverlayEventArgs e)
    {
        EventHandler<EditEndedEditInteractiveOverlayEventArgs> handler = EditEnded;
        if (handler != null)
        {
            handler(this, e);
        }
    }
}

public class EditEndedEditInteractiveOverlayEventArgs : EventArgs
{
}



Here is the code to hook the Track/Edit end event.

// EditEnded.
CustomEditInteractiveOverlay editOverlay = new CustomEditInteractiveOverlay();
editOverlay.EditEnded += new EventHandler<EditEndedEditInteractiveOverlayEventArgs>(EditOverlayEditEnded);
wpfMap1.EditOverlay = editOverlay;

// TrackEnded.
wpfMap1.TrackOverlay.TrackEnded += new EventHandler<TrackEndedTrackInteractiveOverlayEventArgs>(TrackOverlayTrackEnded);



Hope it helps.



Thanks,

Howard



Hi Howard, 
  
   Thanks for the reply.  
 1.) I am not quite clear about the "Tab" key method mentioned. What is "the code" that will be automatically generated? 
 If we do not include the statement for adding the eventhandler for handling "EditOverlay_FeatureDragged" event, what are the steps involved in using the "Tab" key method for generating the code automatically?  
  
  2.) I believe that FeatureDragged event for EditOverlay is the event we have to handle in order to  
 save the editted polygon using the "Track & Edit" functionality of wpf MapSuite 4.0 Desktop. Nevertheless, the current wpf API has certain limitation to even recognize such an event. I may be wrong, then please show me the syntax for adding the EditOverlay_FeatureDragged event handler. 
  
 3.) What is the "EditOverlayEditEnded" event physically?  Is this equivalent to Feature Dragged event? 
  
 Franklin 
  
  
 Franklin

Franklin, 
  
 Sorry for the misunderstanding in my last post. "Tab" key method means the code intelligence. For example, when you type "wpfMap1.EditOverlay.FeatureDragged +=", then press "Tab" key, the code intelligence will generate the handler for you in VS. I guess one parameter in the handler method is missed and this issue happens. 
  
 In Desktop 4.0 and Wpf Edition 4.0, FeatureDragged raises when mouse drag a feature and moving. Some times, we need this event raises only once; for example, when dragging finished; but the FeatureDragged event keeps raising during your dragging. So the EditOverlay.EditEnded event is the one raises only once when your editing behavior is finished. 
  
 Hope it makes sense. If you still has this issue. Please provide us a simple sample so that we can recreate your issue.  
  
 Thanks, 
 Howard

Howard, 
    
    Thanks for explaining the Tab key method, which solves the compilation problem although the previous manual method and the automatic method are literally the same thing!  
 The event handler is added as follows: 
   void EditOverlay_FeatureDragged(object sender, FeatureDraggedEditInteractiveOverlayEventArgs e) 
         { 
             //PolygonShape polygonShape = e.DraggedFeature; 
             ShapeFileFeatureLayer shapeFileFetureLayer = new ShapeFileFeatureLayer(@“C:\testOnload\testLoad.shp”, ShapeFileReadWriteMode.ReadWrite); 
             try 
             { 
                 shapeFileFetureLayer.Open(); 
                 shapeFileFetureLayer.EditTools.BeginTransaction(); 
                 shapeFileFetureLayer.EditTools.Add(e.DraggedFeature); 
                 TransactionResult result = shapeFileFetureLayer.EditTools.CommitTransaction(); 
             } 
             finally 
             { 
                 shapeFileFetureLayer.Close(); 
             }  
  
            // throw new NotImplementedException(); 
         } 
 Got the application rebuilt. But when the saved polygon is displayed in the map, I drag a vetex of the polygon and move it to another location in the map. 
 However, the event of Feature Dragged is not raised. So when i reload the polygon from the file, it is not modified. Is this normal? 
 How does the system tell that an EditEnded event is raised? I don’t understand what physical signal is there to indicate the EditEdit state? 
 Thanks. 
  
 Franklin

Hi Franklin,



The attached sample is what I tested and it works fine. Please have a try. The EditEnded event only raises when mouse up and a feature is edited. So it only raises once after a feature is edited.



If you cannot find your issue with our attached sample, please send us your simple sample so that we can check this issue for you.



Thanks,

Howard



Post8272.zip (10.7 KB)

Hi Howard, 
  
    I guess what you did in the sample is to save the altered rectangle shape into polygondemo.shp with the help of editOverlay_EditEnded, right? 
 To show the effect of such an event handling, I added a Dislay button click event handler as follows: 
    private void DisplayBtn_Click(object sender, RoutedEventArgs e) 
         { 
             Map1.MapUnit = GeographyUnit.DecimalDegree; 
             ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"data\polygondemo.shp"); 
  
             worldLayer.Open(); 
             Collection<Feature> allFeatures = worldLayer.QueryTools.GetAllFeatures(ReturningColumnsType.NoColumns); 
  
             Map1.TrackOverlay.TrackMode = TrackMode.None; 
             foreach (Feature feature in allFeatures) 
             { 
                Map1.EditOverlay.EditShapesLayer.InternalFeatures.Add(feature); 
             } 
             Map1.EditOverlay.CalculateAllControlPoints(); 
             Map1.TrackOverlay.TrackShapeLayer.InternalFeatures.Clear(); 
     
             worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Black)); 
  
             worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
             LayerOverlay layerOverlay = new LayerOverlay(); 
  
             // Add the shapefile layer to the layer overlay  
             layerOverlay.Layers.Add(worldLayer); 
  
  
             Map1.Overlays.Add(layerOverlay); 
  
  
             Map1.Refresh();  
         } 
     } 
 However, when i click the button, the samle application hangs up at  worldLayer.Open(), with an error message complaining that the shp file is used by another process and is not accessable. Do you know how to resolve this issue?  
 Thanks. I think your approach is quite innovative. 
  
 Franklin

Hi Franklin,



I saw your code and copy it to my last sample; the exception throws as you mentioned. By your logic, the layer and overlay will be added sever times. And it conflict with the default layer I added in the constructor of Window1. I changed the code a little to make it correct. Please have a look at it.



Thanks,

Howard



001_Window1.xaml.cs.txt (5.09 KB)

Hi Howard, 
   Replaced the c# code with the one posted. 
    I think that there may be something wrong with Window1.xaml file. Once the rectangle is enlarged,clicking the button leads to the disappearance of the rectangle. After reentering the sample. clicking the button makes no enlarged rectangle appear and the small rectangle also disappears. The Window1.xaml is as follows: 
  
 <Window x:Class="Post8272.Window1" 
     xmlns="schemas.microsoft.com/winfx/2006/xaml/presentation
     xmlns:x="schemas.microsoft.com/winfx/2006/xaml
     xmlns:tg="clr-namespace:ThinkGeo.MapSuite.WpfDesktopEdition;assembly=WpfDesktopEdition" 
     Title="Window1" Height="400" Width="600"> 
     <Grid> 
         <tg:WpfMap x:Name="Map1" Loaded="WpfMap_Loaded" /> 
          
     </Grid> 
 </Window> 
 Could you try this xaml in your environment or you can see the missing part already? Please advise. Thanks. 
  
 Franklin

Hi Howard, 
  
   Somehow the xaml cannot be sent out properly. Could you post the xaml used on your side? 
 Thanks. 
  
 Franklin

Hi Franklin, 
  
 I think that’s what confuses me when clicking the button. Although it fixes the exception but the scenario doesn’t make sense. I think we would better know what your scenario exactly is; and we can provide you a better solution than seeing the partial of code. Just few steps instruction would helpful. 
  
 Thanks, 
 Howard

Hi Howard, 
  
   I believe that the example you conceived represents an effort to address my original concern of creating what event for saving a polygon immediately upon completing the edit of such a polygon on screen. It seems that there is conflict between "resize" event and the "EditEnded" event in the rectangle example. 
 If such a conflict can cause trouble, I wonder if the "EditEnded" event will collide with "MouseUp" event in the "Edit Polygon" case and produce some unwanted effects. I will give it a try. 
  
 Franklin 
  
  


Hi Franklin, 
  
 Please have a try and feel free to let us know if you have more queries. 
  
 Thanks, 
 Howard