diff --git a/MBTiles/WPF/MBTiles.WPF.csproj b/MBTiles/WPF/MBTiles.WPF.csproj index b0939266..94b05804 100644 --- a/MBTiles/WPF/MBTiles.WPF.csproj +++ b/MBTiles/WPF/MBTiles.WPF.csproj @@ -1,7 +1,7 @@  net9.0-windows;net462 - 8.0 + 12.0 true WPF MapControl.MBTiles diff --git a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs index 0e6ea9d7..177f5bab 100644 --- a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs +++ b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs @@ -4,16 +4,11 @@ using Avalonia.Media; using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; 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 @@ -23,26 +18,8 @@ namespace MapControl.UiTools VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center, }; - Loaded += (s, e) => - { - if (DataContext is MapBase map) - { - IsChecked = GetIsChecked(map); - } - }; - - Click += async (s, e) => - { - if (DataContext is MapBase map) - { - await ExecuteAsync(map); - - foreach (var item in ParentMenuItems) - { - item.IsChecked = item.GetIsChecked(map); - } - } - }; + Loaded += (s, e) => Initialize(); + Click += (s, e) => Execute(); } public string Text diff --git a/MapUiTools/Shared/MapLayerMenuItem.cs b/MapUiTools/Shared/MapLayerMenuItem.cs index 11acf835..832bfac4 100644 --- a/MapUiTools/Shared/MapLayerMenuItem.cs +++ b/MapUiTools/Shared/MapLayerMenuItem.cs @@ -29,7 +29,7 @@ namespace MapControl.UiTools #endif public FrameworkElement MapLayer { get; set; } - public override bool GetIsChecked(MapBase map) + protected override bool GetIsChecked(MapBase map) { return MapLayer != null && map.Children.Contains(MapLayer); } diff --git a/MapUiTools/Shared/MapMenuItem.cs b/MapUiTools/Shared/MapMenuItem.cs new file mode 100644 index 00000000..47e78389 --- /dev/null +++ b/MapUiTools/Shared/MapMenuItem.cs @@ -0,0 +1,30 @@ +using System.Threading.Tasks; + +namespace MapControl.UiTools +{ + public abstract partial class MapMenuItem + { + public abstract Task ExecuteAsync(MapBase map); + + protected abstract bool GetIsChecked(MapBase map); + + protected virtual bool GetIsEnabled(MapBase map) => true; + + private void Initialize() + { + if (DataContext is MapBase map) + { + IsEnabled = GetIsEnabled(map); + IsChecked = GetIsChecked(map); + } + } + + private async void Execute() + { + if (DataContext is MapBase map) + { + await ExecuteAsync(map); + } + } + } +} diff --git a/MapUiTools/Shared/MapProjectionMenuItem.cs b/MapUiTools/Shared/MapProjectionMenuItem.cs index 56856f2b..cb5dcf49 100644 --- a/MapUiTools/Shared/MapProjectionMenuItem.cs +++ b/MapUiTools/Shared/MapProjectionMenuItem.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Linq; using System.Threading.Tasks; #if WPF using System.Windows.Markup; @@ -14,20 +15,25 @@ using Avalonia.Metadata; namespace MapControl.UiTools { #if WPF - [ContentProperty(nameof(MapProjection))] + [ContentProperty(nameof(CrsId))] #elif UWP || WINUI - [ContentProperty(Name = nameof(MapProjection))] + [ContentProperty(Name = nameof(CrsId))] #endif public partial class MapProjectionMenuItem : MapMenuItem { #if AVALONIA [Content] #endif - public string MapProjection { get; set; } + public string CrsId { get; set; } - public override bool GetIsChecked(MapBase map) + protected override bool GetIsEnabled(MapBase map) { - return map.MapProjection.ToString() == MapProjection; + return map.MapLayer is not IMapLayer mapLayer || mapLayer.SupportedCrsIds.Contains(CrsId); + } + + protected override bool GetIsChecked(MapBase map) + { + return map.MapProjection.CrsId == CrsId; } public override Task ExecuteAsync(MapBase map) @@ -36,7 +42,7 @@ namespace MapControl.UiTools { try { - map.MapProjection = MapControl.MapProjection.Parse(MapProjection); + map.MapProjection = MapProjection.Parse(CrsId); } catch (Exception ex) { diff --git a/MapUiTools/UWP/MapUiTools.UWP.csproj b/MapUiTools/UWP/MapUiTools.UWP.csproj index cc311997..eb98d71e 100644 --- a/MapUiTools/UWP/MapUiTools.UWP.csproj +++ b/MapUiTools/UWP/MapUiTools.UWP.csproj @@ -6,6 +6,7 @@ UWP MapControl.UiTools XAML Map Control UI Tools Library for UWP + true true en-US diff --git a/MapUiTools/WPF/MapMenuItem.WPF.cs b/MapUiTools/WPF/MapMenuItem.WPF.cs index 5a5df19a..55a9d8bd 100644 --- a/MapUiTools/WPF/MapMenuItem.WPF.cs +++ b/MapUiTools/WPF/MapMenuItem.WPF.cs @@ -1,38 +1,15 @@ using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using System.Windows.Controls; namespace MapControl.UiTools { - public abstract partial class MapMenuItem : MenuItem + public partial class MapMenuItem : MenuItem { - public abstract bool GetIsChecked(MapBase map); - - public abstract Task ExecuteAsync(MapBase map); - protected MapMenuItem() { - Loaded += (s, e) => - { - if (DataContext is MapBase map) - { - IsChecked = GetIsChecked(map); - } - }; - - Click += async (s, e) => - { - if (DataContext is MapBase map) - { - await ExecuteAsync(map); - - foreach (var item in ParentMenuItems) - { - item.IsChecked = item.GetIsChecked(map); - } - } - }; + Loaded += (s, e) => Initialize(); + Click += (s, e) => Execute(); } public string Text diff --git a/MapUiTools/WPF/MapUiTools.WPF.csproj b/MapUiTools/WPF/MapUiTools.WPF.csproj index b3ee134b..acbabd9d 100644 --- a/MapUiTools/WPF/MapUiTools.WPF.csproj +++ b/MapUiTools/WPF/MapUiTools.WPF.csproj @@ -1,7 +1,7 @@  net9.0-windows;net462 - 8.0 + 12.0 true WPF MapControl.UiTools diff --git a/MapUiTools/WinUI/MapMenuItem.WinUI.cs b/MapUiTools/WinUI/MapMenuItem.WinUI.cs index 0c29a993..8395dd1e 100644 --- a/MapUiTools/WinUI/MapMenuItem.WinUI.cs +++ b/MapUiTools/WinUI/MapMenuItem.WinUI.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; #if UWP using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; @@ -13,34 +12,15 @@ namespace MapControl.UiTools { public abstract partial class MapMenuItem : ToggleMenuFlyoutItem { - public abstract bool GetIsChecked(MapBase map); - - public abstract Task ExecuteAsync(MapBase map); - protected MapMenuItem() { Loaded += (s, e) => { ParentMenuItems = ((Panel)VisualTreeHelper.GetParent(this)).Children.OfType().ToList(); - - if (DataContext is MapBase map) - { - IsChecked = GetIsChecked(map); - } + Initialize(); }; - Click += async (s, e) => - { - if (DataContext is MapBase map) - { - await ExecuteAsync(map); - - foreach (var item in ParentMenuItems) - { - item.IsChecked = item.GetIsChecked(map); - } - } - }; + Click += (s, e) => Execute(); } protected IList ParentMenuItems { get; private set; } diff --git a/MapUiTools/WinUI/MapUiTools.WinUI.csproj b/MapUiTools/WinUI/MapUiTools.WinUI.csproj index 81e4153a..50a1a170 100644 --- a/MapUiTools/WinUI/MapUiTools.WinUI.csproj +++ b/MapUiTools/WinUI/MapUiTools.WinUI.csproj @@ -5,6 +5,7 @@ WINUI MapControl.UiTools XAML Map Control UI Tools Library for WinUI + true