diff --git a/MapControl/Shared/MapScale.cs b/MapControl/Shared/MapScale.cs index 37a31a04..3eaf31b1 100644 --- a/MapControl/Shared/MapScale.cs +++ b/MapControl/Shared/MapScale.cs @@ -7,25 +7,21 @@ using System.Globalization; #if WPF using System.Windows; using System.Windows.Controls; -using System.Windows.Data; using System.Windows.Media; using System.Windows.Shapes; #elif UWP using Windows.Foundation; using Windows.UI.Xaml; -using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Shapes; #elif WINUI using Windows.Foundation; using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Data; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Shapes; #elif AVALONIA -using Avalonia.Data; using Avalonia.Controls; using Avalonia.Controls.Shapes; using Avalonia.Media; @@ -40,18 +36,32 @@ namespace MapControl /// /// Draws a map scale overlay. /// - public class MapScale : MapOverlay + public class MapScale : MapPanel { public static readonly DependencyProperty PaddingProperty = DependencyPropertyHelper.Register(nameof(Padding), new Thickness(4)); + public static readonly DependencyProperty StrokeThicknessProperty = + DependencyPropertyHelper.Register(nameof(StrokeThickness), 1d); + + public Thickness Padding + { + get => (Thickness)GetValue(PaddingProperty); + set => SetValue(PaddingProperty, value); + } + + public double StrokeThickness + { + get => (double)GetValue(StrokeThicknessProperty); + set => SetValue(StrokeThicknessProperty, value); + } + private readonly Polyline line = new Polyline(); private readonly TextBlock label = new TextBlock { - HorizontalAlignment = HorizontalAlignment.Left, - VerticalAlignment = VerticalAlignment.Top, - TextAlignment = TextAlignment.Center + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center }; public MapScale() @@ -65,17 +75,12 @@ namespace MapControl { base.SetParentMap(map); - line.SetBinding(Shape.StrokeProperty, this.CreateBinding(nameof(Stroke))); + line.SetBinding(Shape.StrokeProperty, map.CreateBinding(nameof(Map.Foreground))); line.SetBinding(Shape.StrokeThicknessProperty, this.CreateBinding(nameof(StrokeThickness))); -#if UWP || WINUI - label.SetBinding(TextBlock.ForegroundProperty, this.CreateBinding(nameof(Foreground))); -#endif - } - public Thickness Padding - { - get => (Thickness)GetValue(PaddingProperty); - set => SetValue(PaddingProperty, value); +#if UWP || WINUI + label.SetBinding(TextBlock.ForegroundProperty, map.CreateBinding(nameof(Map.Foreground))); +#endif } protected override Size MeasureOverride(Size availableSize) @@ -96,7 +101,7 @@ namespace MapControl var size = new Size( length * scale + StrokeThickness + Padding.Left + Padding.Right, - 1.25 * FontSize + StrokeThickness + Padding.Top + Padding.Bottom); + 1.5 * label.FontSize + 2 * StrokeThickness + Padding.Top + Padding.Bottom); var x1 = Padding.Left + StrokeThickness / 2d; var x2 = size.Width - Padding.Right - StrokeThickness / 2d; @@ -104,19 +109,18 @@ namespace MapControl var y2 = size.Height - Padding.Bottom - StrokeThickness / 2d; line.Points = new PointCollection - { - new Point(x1, y1), - new Point(x1, y2), - new Point(x2, y2), - new Point(x2, y1) - }; - line.Measure(size); + { + new Point(x1, y1), + new Point(x1, y2), + new Point(x2, y2), + new Point(x2, y1) + }; label.Text = length >= 1000d ? string.Format(CultureInfo.InvariantCulture, "{0:F0} km", length / 1000d) : string.Format(CultureInfo.InvariantCulture, "{0:F0} m", length); - label.Width = size.Width; - label.Height = size.Height; + + line.Measure(size); label.Measure(size); return size;