diff --git a/MapControl/Shared/MapOverlay.cs b/MapControl/Shared/MapOverlay.cs index 7f97991b..6f5b2e6c 100644 --- a/MapControl/Shared/MapOverlay.cs +++ b/MapControl/Shared/MapOverlay.cs @@ -20,31 +20,6 @@ namespace MapControl /// public partial class MapOverlay : MapPanel { - public MapOverlay() - { - Loaded += (s, e) => - { -#if WINDOWS_UWP - if (Foreground == null) - { - SetBinding(ForegroundProperty, new Binding - { - Source = this, - Path = new PropertyPath("ParentMap.Foreground") - }); - } -#endif - if (Stroke == null) - { - SetBinding(StrokeProperty, new Binding - { - Source = this, - Path = new PropertyPath("Foreground") - }); - } - }; - } - public double FontSize { get { return (double)GetValue(FontSizeProperty); } @@ -134,5 +109,82 @@ namespace MapControl get { return (double)GetValue(StrokeMiterLimitProperty); } set { SetValue(StrokeMiterLimitProperty, value); } } + + public Binding ForegroundBinding + { + get { return GetBinding(ForegroundProperty, nameof(Foreground)); } + } + + public Binding StrokeBinding + { + get { return GetBinding(StrokeProperty, nameof(Stroke)); } + } + + public Binding StrokeThicknessBinding + { + get { return GetBinding(StrokeThicknessProperty, nameof(StrokeThickness)); } + } + + public Binding StrokeDashArrayBinding + { + get { return GetBinding(StrokeDashArrayProperty, nameof(StrokeDashArray)); } + } + + public Binding StrokeDashOffsetBinding + { + get { return GetBinding(StrokeDashOffsetProperty, nameof(StrokeDashOffset)); } + } + + public Binding StrokeDashCapBinding + { + get { return GetBinding(StrokeDashCapProperty, nameof(StrokeDashCap)); } + } + + public Binding StrokeStartLineCapBinding + { + get { return GetBinding(StrokeStartLineCapProperty, nameof(StrokeStartLineCap)); } + } + + public Binding StrokeEndLineCapBinding + { + get { return GetBinding(StrokeEndLineCapProperty, nameof(StrokeEndLineCap)); } + } + + public Binding StrokeLineJoinBinding + { + get { return GetBinding(StrokeLineJoinProperty, nameof(StrokeLineJoin)); } + } + + public Binding StrokeMiterLimitBinding + { + get { return GetBinding(StrokeMiterLimitProperty, nameof(StrokeMiterLimit)); } + } + + protected override void SetParentMap(MapBase map) + { + if (map != null) + { +#if WINDOWS_UWP + if (Foreground == null) + { + SetBinding(ForegroundProperty, + map.GetBindingExpression(MapBase.ForegroundProperty)?.ParentBinding ?? + new Binding { Source = map, Path = new PropertyPath("Foreground") }); + } +#endif + if (Stroke == null) + { + SetBinding(StrokeProperty, ForegroundBinding); + } + } + + base.SetParentMap(map); + } + + private Binding GetBinding(DependencyProperty property, string propertyName) + { + return GetBindingExpression(property)?.ParentBinding ?? + new Binding { Source = this, Path = new PropertyPath(propertyName) }; + } } } diff --git a/MapControl/Shared/MapPanel.cs b/MapControl/Shared/MapPanel.cs index 92c6ab45..a0042a6e 100644 --- a/MapControl/Shared/MapPanel.cs +++ b/MapControl/Shared/MapPanel.cs @@ -72,21 +72,23 @@ namespace MapControl public MapBase ParentMap { get { return parentMap; } - set + set { SetParentMap(value); } + } + + protected virtual void SetParentMap(MapBase map) + { + if (parentMap != null && parentMap != this) { - if (parentMap != null && parentMap != this) - { - parentMap.ViewportChanged -= OnViewportChanged; - } + parentMap.ViewportChanged -= OnViewportChanged; + } - parentMap = value; + parentMap = map; - if (parentMap != null && parentMap != this) - { - parentMap.ViewportChanged += OnViewportChanged; + if (parentMap != null && parentMap != this) + { + parentMap.ViewportChanged += OnViewportChanged; - OnViewportChanged(new ViewportChangedEventArgs()); - } + OnViewportChanged(new ViewportChangedEventArgs()); } } diff --git a/MapControl/Shared/MapScale.cs b/MapControl/Shared/MapScale.cs index 0c10c373..fde472bd 100644 --- a/MapControl/Shared/MapScale.cs +++ b/MapControl/Shared/MapScale.cs @@ -34,32 +34,15 @@ namespace MapControl public MapScale() { IsHitTestVisible = false; -#if WINDOWS_UWP MinWidth = 100d; -#else - SetCurrentValue(MinWidthProperty, 100d); -#endif + label.HorizontalAlignment = HorizontalAlignment.Left; label.VerticalAlignment = VerticalAlignment.Top; label.TextAlignment = TextAlignment.Center; + label.SetBinding(TextBlock.ForegroundProperty, ForegroundBinding); - label.SetBinding(TextBlock.ForegroundProperty, new Binding - { - Source = this, - Path = new PropertyPath("Foreground") - }); - - line.SetBinding(Shape.StrokeProperty, new Binding - { - Source = this, - Path = new PropertyPath("Stroke") - }); - - line.SetBinding(Shape.StrokeThicknessProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeThickness") - }); + line.SetBinding(Shape.StrokeProperty, StrokeBinding); + line.SetBinding(Shape.StrokeThicknessProperty, StrokeThicknessBinding); Children.Add(line); Children.Add(label); diff --git a/MapControl/UWP/MapGraticule.UWP.cs b/MapControl/UWP/MapGraticule.UWP.cs index bb8eab7a..81fda294 100644 --- a/MapControl/UWP/MapGraticule.UWP.cs +++ b/MapControl/UWP/MapGraticule.UWP.cs @@ -30,12 +30,12 @@ namespace MapControl { if (path == null) { - path = new Path - { - Data = new PathGeometry() - }; - - SetStrokeBindings(path); + path = new Path { Data = new PathGeometry() }; + path.SetBinding(Shape.StrokeProperty, StrokeBinding); + path.SetBinding(Shape.StrokeThicknessProperty, StrokeThicknessBinding); + path.SetBinding(Shape.StrokeDashArrayProperty, StrokeDashArrayBinding); + path.SetBinding(Shape.StrokeDashOffsetProperty, StrokeDashOffsetBinding); + path.SetBinding(Shape.StrokeDashCapProperty, StrokeDashCapBinding); Children.Add(path); } @@ -115,31 +115,14 @@ namespace MapControl renderTransform.Children.Add(ParentMap.RotateTransform); renderTransform.Children.Add(new TranslateTransform()); - label = new TextBlock - { - RenderTransform = renderTransform - }; - - label.SetBinding(TextBlock.ForegroundProperty, new Binding - { - Source = this, - Path = new PropertyPath("Foreground") - }); + label = new TextBlock { RenderTransform = renderTransform }; + label.SetBinding(TextBlock.ForegroundProperty, ForegroundBinding); Children.Add(label); } childIndex++; - if (FontFamily != null) - { - label.FontFamily = FontFamily; - } - - label.FontSize = FontSize; - label.FontStyle = FontStyle; - label.FontStretch = FontStretch; - label.FontWeight = FontWeight; label.Text = GetLabelText(lat, labelFormat, "NS") + "\n" + GetLabelText(Location.NormalizeLongitude(lon), labelFormat, "EW"); label.Tag = new Location(lat, lon); label.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); diff --git a/MapControl/UWP/MapOverlay.UWP.cs b/MapControl/UWP/MapOverlay.UWP.cs index 59ccfa9b..a7346306 100644 --- a/MapControl/UWP/MapOverlay.UWP.cs +++ b/MapControl/UWP/MapOverlay.UWP.cs @@ -4,9 +4,7 @@ using Windows.UI.Text; using Windows.UI.Xaml; -using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Media; -using Windows.UI.Xaml.Shapes; namespace MapControl { @@ -56,62 +54,5 @@ namespace MapControl public static readonly DependencyProperty StrokeMiterLimitProperty = DependencyProperty.Register( nameof(StrokeMiterLimit), typeof(double), typeof(MapOverlay), new PropertyMetadata(1d)); - - public void SetStrokeBindings(Shape shape) - { - shape.SetBinding(Shape.StrokeProperty, new Binding - { - Source = this, - Path = new PropertyPath("Stroke") - }); - - shape.SetBinding(Shape.StrokeThicknessProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeThickness") - }); - - shape.SetBinding(Shape.StrokeDashArrayProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeDashArray") - }); - - shape.SetBinding(Shape.StrokeDashOffsetProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeDashOffset") - }); - - shape.SetBinding(Shape.StrokeDashCapProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeDashCap") - }); - - shape.SetBinding(Shape.StrokeStartLineCapProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeStartLineCap") - }); - - shape.SetBinding(Shape.StrokeEndLineCapProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeEndLineCap") - }); - - shape.SetBinding(Shape.StrokeLineJoinProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeLineJoin") - }); - - shape.SetBinding(Shape.StrokeMiterLimitProperty, new Binding - { - Source = this, - Path = new PropertyPath("StrokeMiterLimit") - }); - } } }