Initial Commit
This commit is contained in:
84
PointMarkers/CenteredTextMarker.cs
Normal file
84
PointMarkers/CenteredTextMarker.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using System;
|
||||
|
||||
namespace Microsoft.Research.DynamicDataDisplay.PointMarkers
|
||||
{
|
||||
/// <summary>Renders specified text near the point</summary>
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user