From 65c93d1a3ee38bc791bb7f201b012538da68efd7 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Thu, 3 Nov 2022 20:10:17 +0100 Subject: [PATCH] Improve Data handling in WPF MapPath --- MapControl/Shared/MapPath.cs | 21 ++++++++++----------- MapControl/WPF/MapPath.WPF.cs | 28 ++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/MapControl/Shared/MapPath.cs b/MapControl/Shared/MapPath.cs index 0d1e7f1d..6675a7b5 100644 --- a/MapControl/Shared/MapPath.cs +++ b/MapControl/Shared/MapPath.cs @@ -68,23 +68,22 @@ namespace MapControl protected virtual void UpdateData() { -#if !WINUI && !UWP - if (Data != null && Data.IsFrozen) - { - Data = Data.Clone(); - return; // UpdateData called again from DataPropertyChanged callback - } -#endif MapPanel.SetLocation(this, Location); if (parentMap != null && Location != null && Data != null) { var scale = parentMap.GetScale(Location); - var transform = new Matrix(scale.X, 0d, 0d, scale.Y, 0d, 0d); + var matrix = new Matrix(scale.X, 0d, 0d, scale.Y, 0d, 0d); + matrix.Rotate(parentMap.ViewTransform.Rotation); - transform.Rotate(parentMap.ViewTransform.Rotation); - - Data.Transform = new MatrixTransform { Matrix = transform }; + if (Data.Transform is MatrixTransform transform) + { + transform.Matrix = matrix; + } + else + { + Data.Transform = new MatrixTransform { Matrix = matrix }; + } } } diff --git a/MapControl/WPF/MapPath.WPF.cs b/MapControl/WPF/MapPath.WPF.cs index 2dda7421..ac4bf432 100644 --- a/MapControl/WPF/MapPath.WPF.cs +++ b/MapControl/WPF/MapPath.WPF.cs @@ -15,14 +15,7 @@ namespace MapControl public partial class MapPath : Shape, IWeakEventListener { public static readonly DependencyProperty DataProperty = Path.DataProperty.AddOwner( - typeof(MapPath), new PropertyMetadata(null, - (o, e) => - { - if (e.NewValue != e.OldValue) // Data is actually a new Geometry - { - ((MapPath)o).UpdateData(); - } - })); + typeof(MapPath), new PropertyMetadata(null, DataPropertyChanged)); public Geometry Data { @@ -32,6 +25,25 @@ namespace MapControl protected override Geometry DefiningGeometry => Data; + private static void DataPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) + { + if (e.NewValue != null && !ReferenceEquals(e.NewValue, e.OldValue)) // Data is actually a new Geometry + { + var path = (MapPath)obj; + var data = (Geometry)e.NewValue; + + if (data.IsFrozen) + { + path.Data = data.Clone(); // DataPropertyChanged called again + } + else + { + data.Transform = new MatrixTransform(); + path.UpdateData(); + } + } + } + #region Methods used only by derived classes MapPolyline, MapPolygon and MapMultiPolygon protected void DataCollectionPropertyChanged(DependencyPropertyChangedEventArgs e)