From 62ffed2cafbaa600bba876551fd1fb96fdd5704e Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Wed, 17 Sep 2025 22:25:50 +0200 Subject: [PATCH] Static MapLayerMenuItem.MapLayerFactory --- MapUiTools/Avalonia/MapMenuItem.Avalonia.cs | 10 +++--- MapUiTools/Shared/MapLayerMenuItem.cs | 40 +++++++-------------- MapUiTools/Shared/MapProjectionMenuItem.cs | 6 ++-- MapUiTools/Shared/MenuButton.cs | 4 ++- MapUiTools/WPF/MapMenuItem.WPF.cs | 12 +++---- MapUiTools/WinUI/MapMenuItem.WinUI.cs | 12 +++---- 6 files changed, 35 insertions(+), 49 deletions(-) diff --git a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs index f4df7744..0e6ea9d7 100644 --- a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs +++ b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs @@ -10,6 +10,10 @@ namespace MapControl.UiTools { public abstract partial class MapMenuItem : MenuItem { + public abstract bool GetIsChecked(MapBase map); + + public abstract Task ExecuteAsync(MapBase map); + protected MapMenuItem() { Icon = new TextBlock @@ -31,7 +35,7 @@ namespace MapControl.UiTools { if (DataContext is MapBase map) { - await Execute(map); + await ExecuteAsync(map); foreach (var item in ParentMenuItems) { @@ -51,10 +55,6 @@ namespace MapControl.UiTools protected override Type StyleKeyOverride => typeof(MenuItem); - protected abstract bool GetIsChecked(MapBase map); - - public abstract Task Execute(MapBase map); - protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs args) { base.OnPropertyChanged(args); diff --git a/MapUiTools/Shared/MapLayerMenuItem.cs b/MapUiTools/Shared/MapLayerMenuItem.cs index 7efd9541..592cfc7e 100644 --- a/MapUiTools/Shared/MapLayerMenuItem.cs +++ b/MapUiTools/Shared/MapLayerMenuItem.cs @@ -22,23 +22,27 @@ namespace MapControl.UiTools #elif UWP || WINUI [ContentProperty(Name = nameof(MapLayer))] #endif - public class MapLayerMenuItem : MapMenuItem + public partial class MapLayerMenuItem : MapMenuItem { + public static Func> MapLayerFactory { get; set; } = + async sourcePath => sourcePath.EndsWith(".kmz") || sourcePath.EndsWith(".kml") + ? (FrameworkElement)await GroundOverlay.CreateAsync(sourcePath) + : (FrameworkElement)await GeoImage.CreateAsync(sourcePath); #if AVALONIA [Content] #endif public FrameworkElement MapLayer { get; set; } - public Func> MapLayerFactory { get; set; } + public string SourcePath { get; set; } - protected override bool GetIsChecked(MapBase map) + public override bool GetIsChecked(MapBase map) { return MapLayer != null && map.Children.Contains(MapLayer); } - public override async Task Execute(MapBase map) + public override async Task ExecuteAsync(MapBase map) { - MapLayer ??= await MapLayerFactory?.Invoke(); + MapLayer ??= await MapLayerFactory?.Invoke(SourcePath); if (MapLayer != null) { @@ -47,33 +51,13 @@ namespace MapControl.UiTools } } - public class MapOverlayMenuItem : MapLayerMenuItem + public partial class MapOverlayMenuItem : MapLayerMenuItem { - private string sourcePath; - - public string SourcePath - { - get => sourcePath; - set - { - sourcePath = value; - - if (sourcePath.EndsWith(".kmz") || sourcePath.EndsWith(".kml")) - { - MapLayerFactory = async () => await GroundOverlay.CreateAsync(sourcePath); - } - else - { - MapLayerFactory = async () => await GeoImage.CreateAsync(sourcePath); - } - } - } - public int InsertOrder { get; set; } - public override async Task Execute(MapBase map) + public override async Task ExecuteAsync(MapBase map) { - MapLayer ??= await MapLayerFactory?.Invoke(); + MapLayer ??= await MapLayerFactory?.Invoke(SourcePath); if (MapLayer != null) { diff --git a/MapUiTools/Shared/MapProjectionMenuItem.cs b/MapUiTools/Shared/MapProjectionMenuItem.cs index 9e5cf1e9..56856f2b 100644 --- a/MapUiTools/Shared/MapProjectionMenuItem.cs +++ b/MapUiTools/Shared/MapProjectionMenuItem.cs @@ -18,19 +18,19 @@ namespace MapControl.UiTools #elif UWP || WINUI [ContentProperty(Name = nameof(MapProjection))] #endif - public class MapProjectionMenuItem : MapMenuItem + public partial class MapProjectionMenuItem : MapMenuItem { #if AVALONIA [Content] #endif public string MapProjection { get; set; } - protected override bool GetIsChecked(MapBase map) + public override bool GetIsChecked(MapBase map) { return map.MapProjection.ToString() == MapProjection; } - public override Task Execute(MapBase map) + public override Task ExecuteAsync(MapBase map) { if (!GetIsChecked(map)) { diff --git a/MapUiTools/Shared/MenuButton.cs b/MapUiTools/Shared/MenuButton.cs index 05d0f096..5fecf16b 100644 --- a/MapUiTools/Shared/MenuButton.cs +++ b/MapUiTools/Shared/MenuButton.cs @@ -40,7 +40,9 @@ namespace MapControl.UiTools if (initialItem != null) { - await initialItem.Execute(Map); + initialItem.IsChecked = true; + + await initialItem.ExecuteAsync(Map); } } } diff --git a/MapUiTools/WPF/MapMenuItem.WPF.cs b/MapUiTools/WPF/MapMenuItem.WPF.cs index 26052acf..5a5df19a 100644 --- a/MapUiTools/WPF/MapMenuItem.WPF.cs +++ b/MapUiTools/WPF/MapMenuItem.WPF.cs @@ -5,8 +5,12 @@ using System.Windows.Controls; namespace MapControl.UiTools { - public abstract class MapMenuItem : MenuItem + public abstract partial class MapMenuItem : MenuItem { + public abstract bool GetIsChecked(MapBase map); + + public abstract Task ExecuteAsync(MapBase map); + protected MapMenuItem() { Loaded += (s, e) => @@ -21,7 +25,7 @@ namespace MapControl.UiTools { if (DataContext is MapBase map) { - await Execute(map); + await ExecuteAsync(map); foreach (var item in ParentMenuItems) { @@ -38,9 +42,5 @@ namespace MapControl.UiTools } protected IEnumerable ParentMenuItems => ((ItemsControl)Parent).Items.OfType(); - - protected abstract bool GetIsChecked(MapBase map); - - public abstract Task Execute(MapBase map); } } diff --git a/MapUiTools/WinUI/MapMenuItem.WinUI.cs b/MapUiTools/WinUI/MapMenuItem.WinUI.cs index 6d7a3800..0c29a993 100644 --- a/MapUiTools/WinUI/MapMenuItem.WinUI.cs +++ b/MapUiTools/WinUI/MapMenuItem.WinUI.cs @@ -11,8 +11,12 @@ using Microsoft.UI.Xaml.Media; namespace MapControl.UiTools { - public abstract class MapMenuItem : ToggleMenuFlyoutItem + public abstract partial class MapMenuItem : ToggleMenuFlyoutItem { + public abstract bool GetIsChecked(MapBase map); + + public abstract Task ExecuteAsync(MapBase map); + protected MapMenuItem() { Loaded += (s, e) => @@ -29,7 +33,7 @@ namespace MapControl.UiTools { if (DataContext is MapBase map) { - await Execute(map); + await ExecuteAsync(map); foreach (var item in ParentMenuItems) { @@ -40,9 +44,5 @@ namespace MapControl.UiTools } protected IList ParentMenuItems { get; private set; } - - protected abstract bool GetIsChecked(MapBase map); - - public abstract Task Execute(MapBase map); } }