using System.Threading; using System.Windows; using System.Windows.Media; using System; namespace Microsoft.Research.DynamicDataDisplay.PointMarkers { /// Renders specified text near the point public class CenteredTextMarker : PointMarker { public static double DEFAULT_VERTICAL_SHIFT=-20; public static double DEFAULT_HORIZONTAL_SHIFT=0; public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof(string), typeof(CenteredTextMarker), new FrameworkPropertyMetadata("")); public static readonly DependencyProperty VerticalShiftProperty = DependencyProperty.Register( "VerticalShift", typeof(string), typeof(CenteredTextMarker), new FrameworkPropertyMetadata("")); public static readonly DependencyProperty HorizontalShiftProperty = DependencyProperty.Register( "HorizontalShift", typeof(string), typeof(CenteredTextMarker), new FrameworkPropertyMetadata("")); public string VerticalShift { get { return (string)GetValue(VerticalShiftProperty); } set { SetValue(VerticalShiftProperty, value); } } public string HorizontalShift { get { return (string)GetValue(HorizontalShiftProperty); } set { SetValue(HorizontalShiftProperty, value); } } public override void Render(DrawingContext dc, Point screenPoint) { FormattedText textToDraw = new FormattedText(Text, Thread.CurrentThread.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 12, Brushes.Black,1.0); double width = textToDraw.Width; double height = textToDraw.Height; double verticalShift = DEFAULT_VERTICAL_SHIFT; // px if (null != VerticalShift&&!"".Equals(VerticalShift))verticalShift = double.Parse(VerticalShift); double horizontalShift=DEFAULT_HORIZONTAL_SHIFT; if (null != HorizontalShift&&!"".Equals(HorizontalShift)) horizontalShift = double.Parse(HorizontalShift); // Rect bounds = RectExtensions.FromCenterSize(new Point(screenPoint.X+horizontalShift, screenPoint.Y + verticalShift - height / 2),new Size(width, height)); double xPoint=0.00; double yPoint=0.00; if(0.00==horizontalShift)xPoint=screenPoint.X+horizontalShift; else xPoint=screenPoint.X+horizontalShift - width/2; yPoint=screenPoint.Y + verticalShift - height / 2; Rect bounds = RectExtensions.FromCenterSize(new Point(xPoint, yPoint),new Size(width, height)); // forcing the X bound is incorrect as this will always force the text into the visible viewport even when it should be out of view // if(bounds.X<0)bounds.X=Math.Abs(horizontalShift); Point loc = bounds.Location; bounds = CoordinateUtilities.RectZoom(bounds, 1.05, 1.15); dc.DrawLine(new Pen(Brushes.Black, 1), Point.Add(screenPoint, new Vector(0, verticalShift)), screenPoint); dc.DrawRectangle(Brushes.White, new Pen(Brushes.Black, 1), bounds); dc.DrawText(textToDraw, loc); } } }