XAML-Map-Control/MapUiTools/Shared/MapLayersMenuButton.cs

159 lines
4.4 KiB
C#
Raw Normal View History

2022-01-11 19:42:12 +01:00
// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control
// © 2022 Clemens Fischer
// Licensed under the Microsoft Public License (Ms-PL)
2022-01-13 20:12:49 +01:00
using System.Collections.ObjectModel;
using System.Collections.Specialized;
2021-12-05 17:16:14 +01:00
using System.Linq;
#if WINUI
using Microsoft.UI.Xaml;
2022-01-13 20:12:49 +01:00
using Microsoft.UI.Xaml.Markup;
2021-12-05 17:16:14 +01:00
#elif UWP
using Windows.UI.Xaml;
2022-01-13 20:12:49 +01:00
using Windows.UI.Xaml.Markup;
2021-12-05 17:16:14 +01:00
#else
using System.Windows;
2022-01-13 20:12:49 +01:00
using System.Windows.Markup;
2021-12-05 17:16:14 +01:00
#endif
2022-01-11 19:42:12 +01:00
namespace MapControl.UiTools
2021-12-05 17:16:14 +01:00
{
2022-01-13 20:12:49 +01:00
#if WINUI || UWP
[ContentProperty(Name = nameof(Layer))]
#else
[ContentProperty(nameof(Layer))]
#endif
public class MapLayerItem
{
public string Text { get; set; }
public UIElement Layer { get; set; }
}
#if WINUI || UWP
[ContentProperty(Name = nameof(MapLayers))]
#else
[ContentProperty(nameof(MapLayers))]
#endif
2021-12-05 17:16:14 +01:00
public class MapLayersMenuButton : MenuButton
{
2022-01-21 18:37:05 +01:00
private UIElement selectedLayer;
2021-12-05 17:16:14 +01:00
public MapLayersMenuButton()
2022-01-11 19:42:12 +01:00
: base("\uE81E")
2021-12-05 17:16:14 +01:00
{
2022-01-13 20:12:49 +01:00
((INotifyCollectionChanged)MapLayers).CollectionChanged += (s, e) => InitializeMenu();
((INotifyCollectionChanged)MapOverlays).CollectionChanged += (s, e) => InitializeMenu();
2021-12-05 17:16:14 +01:00
}
public static readonly DependencyProperty MapProperty = DependencyProperty.Register(
nameof(Map), typeof(MapBase), typeof(MapLayersMenuButton),
new PropertyMetadata(null, (o, e) => ((MapLayersMenuButton)o).InitializeMenu()));
public MapBase Map
{
2022-08-06 11:04:49 +02:00
get => (MapBase)GetValue(MapProperty);
set => SetValue(MapProperty, value);
2021-12-05 17:16:14 +01:00
}
2022-01-13 20:12:49 +01:00
public Collection<MapLayerItem> MapLayers { get; } = new ObservableCollection<MapLayerItem>();
2021-12-05 17:16:14 +01:00
2022-01-13 20:12:49 +01:00
public Collection<MapLayerItem> MapOverlays { get; } = new ObservableCollection<MapLayerItem>();
2021-12-05 17:16:14 +01:00
private void InitializeMenu()
{
2022-01-13 20:12:49 +01:00
if (Map != null)
2021-12-05 17:16:14 +01:00
{
var menu = CreateMenu();
2022-01-13 20:12:49 +01:00
foreach (var item in MapLayers)
2021-12-05 17:16:14 +01:00
{
2022-01-13 20:12:49 +01:00
menu.Items.Add(CreateMenuItem(item.Text, item.Layer, MapLayerClicked));
2021-12-05 17:16:14 +01:00
}
2022-01-13 20:12:49 +01:00
var initialLayer = MapLayers.Select(l => l.Layer).FirstOrDefault();
2021-12-05 17:16:14 +01:00
2022-01-13 20:12:49 +01:00
if (MapOverlays.Count > 0)
2021-12-05 17:16:14 +01:00
{
if (initialLayer != null)
{
menu.Items.Add(CreateSeparator());
}
2022-01-13 20:12:49 +01:00
foreach (var item in MapOverlays)
2021-12-05 17:16:14 +01:00
{
2022-01-13 20:12:49 +01:00
menu.Items.Add(CreateMenuItem(item.Text, item.Layer, MapOverlayClicked));
2021-12-05 17:16:14 +01:00
}
}
if (initialLayer != null)
{
SetMapLayer(initialLayer);
}
}
}
private void MapLayerClicked(object sender, RoutedEventArgs e)
{
var item = (FrameworkElement)sender;
var layer = (UIElement)item.Tag;
SetMapLayer(layer);
}
private void MapOverlayClicked(object sender, RoutedEventArgs e)
{
var item = (FrameworkElement)sender;
var layer = (UIElement)item.Tag;
ToggleMapOverlay(layer);
}
private void SetMapLayer(UIElement layer)
{
2022-01-21 18:37:05 +01:00
if (selectedLayer != layer)
{
selectedLayer = layer;
Map.MapLayer = selectedLayer;
}
2021-12-05 17:16:14 +01:00
UpdateCheckedStates();
}
private void ToggleMapOverlay(UIElement layer)
{
if (Map.Children.Contains(layer))
{
Map.Children.Remove(layer);
}
else
{
int index = 1;
2022-01-13 20:12:49 +01:00
foreach (var overlay in MapOverlays.Select(l => l.Layer))
2021-12-05 17:16:14 +01:00
{
if (overlay == layer)
{
Map.Children.Insert(index, layer);
break;
}
if (Map.Children.Contains(overlay))
{
index++;
}
}
}
UpdateCheckedStates();
}
private void UpdateCheckedStates()
{
foreach (var item in GetMenuItems())
{
item.IsChecked = Map.Children.Contains((UIElement)item.Tag);
}
}
}
}