diff --git a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs index ad3b1d80..f4df7744 100644 --- a/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs +++ b/MapUiTools/Avalonia/MapMenuItem.Avalonia.cs @@ -8,9 +8,9 @@ using System.Threading.Tasks; namespace MapControl.UiTools { - public abstract class MapMenuItem : MenuItem + public abstract partial class MapMenuItem : MenuItem { - public MapMenuItem() + protected MapMenuItem() { Icon = new TextBlock { @@ -18,6 +18,27 @@ namespace MapControl.UiTools FontWeight = FontWeight.Black, 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 Execute(map); + + foreach (var item in ParentMenuItems) + { + item.IsChecked = item.GetIsChecked(map); + } + } + }; } public string Text @@ -26,12 +47,14 @@ namespace MapControl.UiTools set => Header = value; } - public abstract Task Execute(MapBase map); - protected IEnumerable ParentMenuItems => ((ItemsControl)Parent).Items.OfType(); 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 b7956cac..4b17abfa 100644 --- a/MapUiTools/Shared/MapLayerMenuItem.cs +++ b/MapUiTools/Shared/MapLayerMenuItem.cs @@ -31,28 +31,9 @@ namespace MapControl.UiTools public Func> MapLayerFactory { get; set; } - public MapLayerMenuItem() + protected override bool GetIsChecked(MapBase map) { - Loaded += (s, e) => - { - if (DataContext is MapBase map) - { - IsChecked = map.Children.Contains(MapLayer); - } - }; - - Click += async (s, e) => - { - if (DataContext is MapBase map) - { - await Execute(map); - - foreach (var item in ParentMenuItems.OfType()) - { - item.IsChecked = map.Children.Contains(item.MapLayer); - } - } - }; + return map.Children.Contains(MapLayer); } public override async Task Execute(MapBase map) diff --git a/MapUiTools/Shared/MapProjectionMenuItem.cs b/MapUiTools/Shared/MapProjectionMenuItem.cs index 9f03584e..50e002e8 100644 --- a/MapUiTools/Shared/MapProjectionMenuItem.cs +++ b/MapUiTools/Shared/MapProjectionMenuItem.cs @@ -1,6 +1,5 @@ using System; using System.Diagnostics; -using System.Linq; using System.Threading.Tasks; #if WPF using System.Windows.Markup; @@ -26,28 +25,9 @@ namespace MapControl.UiTools #endif public string MapProjection { get; set; } - public MapProjectionMenuItem() + protected override bool GetIsChecked(MapBase map) { - Loaded += (s, e) => - { - if (DataContext is MapBase map) - { - IsChecked = map.MapProjection.CrsId == MapProjection; - } - }; - - Click += async (s, e) => - { - if (DataContext is MapBase map) - { - await Execute(map); - - foreach (var item in ParentMenuItems.OfType()) - { - item.IsChecked = map.MapProjection.CrsId == item.MapProjection; - } - } - }; + return map.MapProjection.CrsId == MapProjection; } public override Task Execute(MapBase map) diff --git a/MapUiTools/WPF/MapMenuItem.WPF.cs b/MapUiTools/WPF/MapMenuItem.WPF.cs index ab18683f..26052acf 100644 --- a/MapUiTools/WPF/MapMenuItem.WPF.cs +++ b/MapUiTools/WPF/MapMenuItem.WPF.cs @@ -7,14 +7,40 @@ namespace MapControl.UiTools { public abstract class MapMenuItem : MenuItem { + protected MapMenuItem() + { + Loaded += (s, e) => + { + if (DataContext is MapBase map) + { + IsChecked = GetIsChecked(map); + } + }; + + Click += async (s, e) => + { + if (DataContext is MapBase map) + { + await Execute(map); + + foreach (var item in ParentMenuItems) + { + item.IsChecked = item.GetIsChecked(map); + } + } + }; + } + public string Text { get => Header as string; set => Header = value; } - public abstract Task Execute(MapBase map); - 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 d3cacd5a..6d7a3800 100644 --- a/MapUiTools/WinUI/MapMenuItem.WinUI.cs +++ b/MapUiTools/WinUI/MapMenuItem.WinUI.cs @@ -15,11 +15,34 @@ namespace MapControl.UiTools { protected MapMenuItem() { - Loaded += (s, e) => ParentMenuItems = ((Panel)VisualTreeHelper.GetParent(this)).Children.OfType().ToList(); + Loaded += (s, e) => + { + ParentMenuItems = ((Panel)VisualTreeHelper.GetParent(this)).Children.OfType().ToList(); + + if (DataContext is MapBase map) + { + IsChecked = GetIsChecked(map); + } + }; + + Click += async (s, e) => + { + if (DataContext is MapBase map) + { + await Execute(map); + + foreach (var item in ParentMenuItems) + { + item.IsChecked = item.GetIsChecked(map); + } + } + }; } - public abstract Task Execute(MapBase map); - protected IList ParentMenuItems { get; private set; } + + protected abstract bool GetIsChecked(MapBase map); + + public abstract Task Execute(MapBase map); } }