[12503] | 1 | using System.Threading;
|
---|
| 2 | using System.Windows;
|
---|
| 3 | using System.Windows.Media;
|
---|
| 4 |
|
---|
| 5 | namespace Microsoft.Research.DynamicDataDisplay.PointMarkers
|
---|
| 6 | {
|
---|
| 7 | /// <summary>Renders specified text near the point</summary>
|
---|
| 8 | public class CenteredTextMarker : PointMarker
|
---|
| 9 | {
|
---|
| 10 | public string Text
|
---|
| 11 | {
|
---|
| 12 | get { return (string)GetValue(TextProperty); }
|
---|
| 13 | set { SetValue(TextProperty, value); }
|
---|
| 14 | }
|
---|
| 15 |
|
---|
| 16 | public static readonly DependencyProperty TextProperty =
|
---|
| 17 | DependencyProperty.Register(
|
---|
| 18 | "Text",
|
---|
| 19 | typeof(string),
|
---|
| 20 | typeof(CenteredTextMarker),
|
---|
| 21 | new FrameworkPropertyMetadata(""));
|
---|
| 22 |
|
---|
| 23 | public override void Render(DrawingContext dc, Point screenPoint)
|
---|
| 24 | {
|
---|
| 25 | FormattedText textToDraw = new FormattedText(Text, Thread.CurrentThread.CurrentCulture,
|
---|
| 26 | FlowDirection.LeftToRight, new Typeface("Arial"), 12, Brushes.Black);
|
---|
| 27 |
|
---|
| 28 | double width = textToDraw.Width;
|
---|
| 29 | double height = textToDraw.Height;
|
---|
| 30 |
|
---|
| 31 | const double verticalShift = -20; // px
|
---|
| 32 |
|
---|
| 33 | Rect bounds = RectExtensions.FromCenterSize(new Point(screenPoint.X, screenPoint.Y + verticalShift - height / 2),
|
---|
| 34 | new Size(width, height));
|
---|
| 35 |
|
---|
| 36 | Point loc = bounds.Location;
|
---|
| 37 | bounds = CoordinateUtilities.RectZoom(bounds, 1.05, 1.15);
|
---|
| 38 |
|
---|
| 39 | dc.DrawLine(new Pen(Brushes.Black, 1), Point.Add(screenPoint, new Vector(0, verticalShift)), screenPoint);
|
---|
| 40 | dc.DrawRectangle(Brushes.White, new Pen(Brushes.Black, 1), bounds);
|
---|
| 41 | dc.DrawText(textToDraw, loc);
|
---|
| 42 | }
|
---|
| 43 | }
|
---|
| 44 | }
|
---|