ThinkGeo.com    |     Documentation    |     Premium Support

Strange behavior with TextStyle.Formatting delegate

I'm firing off an event to change the text content of a label as shown below.


TextStyle textstyle = TextStyles.Park1("ID");

textstyle.Formatting += DefaultTextStyle_Formatting;


However, one problem, which I'm not sure is a bug or not, is that the polygon listed in the FormattingPositionStyleEventArgs parameter is a little bit crazy. It appears to be in screen coordinates (not in the map projection), and a call to GetFeature() doesn't return any existing feature, but seems to make up its own!!


Is this how it is supposed to be?? Possibly a bug?



Hi David , 
  
 The polygon you talked about is in screen coordinates shape, and this is an advanced method for the users who want to use the polygon’s screen location to format the text’s such as length, size ,etc… 
  
 Regards, 
 Edgar

 Thanks Edgar - is it possible for you to modify this to included the Feature (which the label belongs to) to be added to the FormattingPositionStyleEventArgs parameter? ... or perhaps as a separate argument in the event definition... I guess its pretty common to include a "sender" in an event definition... the Feature would effectively be the sender. This would make this event infinitely more powerful, as you could then run tests on the Feature to change the text to whatever you wanted (which is what I wish to do!).



As the TextStyle is to draw text on the screen, so the coordinates should  be screen points, and we won't add an origin feature to it, but there is a workaround for you to get the original feature, here is the code,



        void DefaultTextStyle_Formatting(object sender, FormattingPositionStyleEventArgs e)
        {
            PolygonShape polygon = e.Shape as PolygonShape;
            PolygonShape newPolygon = new PolygonShape();

            for (int i = 0; i < polygon.OuterRing.Vertices.Count; i++)
            {
                newPolygon.OuterRing.Vertices.Add(new Vertex(ExtentHelper.ToWorldCoordinate(Map1.CurrentExtent, (float)polygon.OuterRing.Vertices[i].X, (float)polygon.OuterRing.Vertices[i].Y, Map1.ActualWidth, Map1.ActualHeight)));
            }
            foreach (var item in polygon.InnerRings)
            {
                RingShape ring = new RingShape();
                for (int i = 0; i < item.Vertices.Count; i++)
                {
                    ring.Vertices.Add(new Vertex(ExtentHelper.ToWorldCoordinate(Map1.CurrentExtent, (float)item.Vertices[i].X, (float)item.Vertices[i].Y, Map1.ActualWidth, Map1.ActualHeight)));
                }
                newPolygon.InnerRings.Add(ring);
            }
        }

Hope it helps,


Edgar