diff --git a/MapUiTools/Shared/MapLayersMenuButton.cs b/MapUiTools/Shared/MapLayersMenuButton.cs index 3a34e898..0a7375e7 100644 --- a/MapUiTools/Shared/MapLayersMenuButton.cs +++ b/MapUiTools/Shared/MapLayersMenuButton.cs @@ -2,6 +2,7 @@ // © 2022 Clemens Fischer // Licensed under the Microsoft Public License (Ms-PL) +using System; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; @@ -27,6 +28,9 @@ namespace MapControl.UiTools { public string Text { get; set; } public UIElement Layer { get; set; } + public Func LayerFactory { get; set; } + + public UIElement GetLayer() => Layer ?? (Layer = LayerFactory?.Invoke()); } #if WINUI || UWP @@ -67,10 +71,10 @@ namespace MapControl.UiTools foreach (var item in MapLayers) { - menu.Items.Add(CreateMenuItem(item.Text, item.Layer, MapLayerClicked)); + menu.Items.Add(CreateMenuItem(item.Text, item, MapLayerClicked)); } - var initialLayer = MapLayers.Select(l => l.Layer).FirstOrDefault(); + var initialLayer = MapLayers.Select(l => l.GetLayer()).FirstOrDefault(); if (MapOverlays.Count > 0) { @@ -81,7 +85,7 @@ namespace MapControl.UiTools foreach (var item in MapOverlays) { - menu.Items.Add(CreateMenuItem(item.Text, item.Layer, MapOverlayClicked)); + menu.Items.Add(CreateMenuItem(item.Text, item, MapOverlayClicked)); } } @@ -95,17 +99,17 @@ namespace MapControl.UiTools private void MapLayerClicked(object sender, RoutedEventArgs e) { var item = (FrameworkElement)sender; - var layer = (UIElement)item.Tag; + var mapLayerItem = (MapLayerItem)item.Tag; - SetMapLayer(layer); + SetMapLayer(mapLayerItem.GetLayer()); } private void MapOverlayClicked(object sender, RoutedEventArgs e) { var item = (FrameworkElement)sender; - var layer = (UIElement)item.Tag; + var mapLayerItem = (MapLayerItem)item.Tag; - ToggleMapOverlay(layer); + ToggleMapOverlay(mapLayerItem.GetLayer()); } private void SetMapLayer(UIElement layer) @@ -129,7 +133,7 @@ namespace MapControl.UiTools { int index = 1; - foreach (var overlay in MapOverlays.Select(l => l.Layer)) + foreach (var overlay in MapOverlays.Select(o => o.Layer).Where(o => o != null)) { if (overlay == layer) { @@ -151,7 +155,7 @@ namespace MapControl.UiTools { foreach (var item in GetMenuItems()) { - item.IsChecked = Map.Children.Contains((UIElement)item.Tag); + item.IsChecked = Map.Children.Contains(((MapLayerItem)item.Tag).Layer); } } }