using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; namespace Tango.SharedUI.Controls { public class HexagonControl : Shape { private Geometry _geometry; private ScaleTransform _scale; public Point[] Points { get; set; } protected override Geometry DefiningGeometry => _geometry; public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } } public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(HexagonControl), new PropertyMetadata(false, (d, e) => (d as HexagonControl).OnIsSelectedChanged())); public int Row { get { return (int)GetValue(RowProperty); } set { SetValue(RowProperty, value); } } public static readonly DependencyProperty RowProperty = DependencyProperty.Register("Row", typeof(int), typeof(HexagonControl), new PropertyMetadata(0)); public int Column { get { return (int)GetValue(ColumnProperty); } set { SetValue(ColumnProperty, value); } } public static readonly DependencyProperty ColumnProperty = DependencyProperty.Register("Column", typeof(int), typeof(HexagonControl), new PropertyMetadata(0)); public bool DisplayGridPosition { get { return (bool)GetValue(DisplayGridPositionProperty); } set { SetValue(DisplayGridPositionProperty, value); } } public static readonly DependencyProperty DisplayGridPositionProperty = DependencyProperty.Register("DisplayGridPosition", typeof(bool), typeof(HexagonControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); private void OnIsSelectedChanged() { if (IsSelected) { StrokeThickness = 3; } else { StrokeThickness = 1; } } public HexagonControl(Point[] points, int row, int column) { Points = points; Row = row; Column = column; _geometry = new PathGeometry(new PathFigure[] { new PathFigure(points[0],new PathSegment[] { new PolyLineSegment(points.Skip(1), true), },true), }); RenderTransformOrigin = new Point(0.8, 0.8); _scale = new ScaleTransform(1, 1); RenderTransform = _scale; } protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); if (DisplayGridPosition) { Typeface typeface = new Typeface("Times New Roman"); double em_size = 16; #pragma warning disable CS0618 // Type or member is obsolete FormattedText formatted_text = new FormattedText( Row + "," + Column, CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, typeface, em_size, Brushes.Black); #pragma warning restore CS0618 // Type or member is obsolete // Center the text horizontally. formatted_text.TextAlignment = TextAlignment.Center; var rect = _geometry.GetFlattenedPathGeometry().Bounds; // Find the center of the client area. double xmid = rect.Left + rect.Width / 2; double ymid = rect.Top + rect.Height / 2; Point center = new Point(xmid, ymid - formatted_text.Height / 2); drawingContext.DrawText(formatted_text, center); } } protected override void OnMouseEnter(MouseEventArgs e) { base.OnMouseEnter(e); if (!IsSelected) { _scale.ScaleX = 1.1; _scale.ScaleY = 1.1; } } protected override void OnMouseLeave(MouseEventArgs e) { base.OnMouseLeave(e); _scale.ScaleX = 1; _scale.ScaleY = 1; } } }