ThinkGeo.com    |     Documentation    |     Premium Support

Updating Popup Arrow XY

I posted here…thinkgeo.com/forums/MapSuite/tabid/143/aft/9527/Default.aspx … but I am not sure if that is still being monitored so I thought I would create a new thread.



I followed the discussion in that post and was able to relocate my popup call out box to the right instead of above the feature.  However, my arrow is still off by a little bit.  I saw another person posted about finding the popup’s container to adjust its margin.  However, I haven’t been able to find that container to edit it.  I am also wondering if there is a way to change the format/color of the popup through that section of code instead of going through the XAML? For instance, if I wanted to customize the appearance by feature or something.More precisely, I am looking how to edit the x/y and the appearance of the arrow part of the popup box.



If there is a way to programmatically set/adjust the XY placement of the arrow point as well as the length of the arrow, that would help me out tremendously.  I am looking to see if there is flexibility that I can use to check the screen location of the popup and possibly stretch it away from a cluster of features or reposition it based off of the screen location.



I have attached a screenshot showing the placement being off.  That is my major hurdle right now, and the rest is just icing on the cake.

Hi Brandon,



That’s better to create a new topic on a new question.



In order to make thing more clear, would you mind attach the codes you have done so that we can modify it based on it? As for your further requirement to customize the popup appearance and the arrow position and even length, I think it is possible, but should be more complex. I  attached our popup template so that it helps:


<ResourceDictionary xmlns="<a href=“schemas.microsoft.com/winfx/2006/xaml/presentation” tabindex=“0”>schemas.microsoft.com/winfx/...esentation</a>"
    xmlns:x="<a href=“schemas.microsoft.com/winfx/2006/xaml” tabindex=“0”>schemas.microsoft.com/winfx/2006/xaml</a>"
    xmlns:local=“clr-namespace:ThinkGeo.MapSuite.WpfDesktopEdition”>
    <Style TargetType="{x:Type local:Popup}">
        <Setter Property=“Template”>
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Popup}">
                    <Canvas Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                        <Border x:Name=“BorderTemplate” Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}">
                            <ContentControl Margin=“4” x:Name=“ContentTemplate” Content="{TemplateBinding Content}" />
                        </Border>
                        <Polygon x:Name=“ArrowTemplate” Points=“0,0 20,0 10,10” Fill="{TemplateBinding Background}"
                                 Margin="-10 0 0 0">
                        </Polygon>
                    </Canvas>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

The below is some codes to show how to custom the appearance:




public class MyPopup : Popup
    {
        private Polyline arrow;
        private Border border;
 
        public override void OnApplyTemplate()
        {
            arrow = (Polygon)GetTemplateChild(“ArrowTemplate”);
            borderTemplate = (Border)GetTemplateChild(“BorderTemplate”);
            borderTemplate.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            arrow.SetValue(Canvas.LeftProperty, borderTemplate.DesiredSize.Width / 2);
            arrow.SetValue(Canvas.TopProperty, borderTemplate.DesiredSize.Height);
            if (arrow != null)
            {
                arrow.Points = new PointCollection(new Collection<Point>() { new Point(0, 0), new Point(20, 0), new Point(10, ArrowHeight) });
 
                double marginLeft = borderTemplate.DesiredSize.Width * -.5;
                double marginTop = borderTemplate.DesiredSize.Height * -1 - ArrowHeight;
                Margin = new Thickness(marginLeft, marginTop, 0, 0);
            }
        }
    }

The above codes shows the way to handler the popup template, but the details still need us to calculate and enhance. 

Hope it helps.

Thanks,

Troy