mirror of
https://github.com/ClemensFischer/XAML-Map-Control.git
synced 2026-04-07 23:45:05 +00:00
New menu item implementation based directly on MenuItem/ToggleMenuFlyoutItem
This commit is contained in:
parent
11cd45c099
commit
e06dcc5155
12 changed files with 335 additions and 412 deletions
90
MapUiTools/Shared/MapLayerMenuItem.cs
Normal file
90
MapUiTools/Shared/MapLayerMenuItem.cs
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
#if WPF
|
||||
using System.Windows;
|
||||
using System.Windows.Markup;
|
||||
#elif UWP
|
||||
using Windows.UI.Xaml;
|
||||
using Windows.UI.Xaml.Markup;
|
||||
#elif WINUI
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Markup;
|
||||
#else
|
||||
using Avalonia.Metadata;
|
||||
using FrameworkElement = Avalonia.Controls.Control;
|
||||
#endif
|
||||
|
||||
namespace MapControl.UiTools
|
||||
{
|
||||
#if WPF
|
||||
[ContentProperty(nameof(MapLayer))]
|
||||
#elif UWP || WINUI
|
||||
[ContentProperty(Name = nameof(MapLayer))]
|
||||
#endif
|
||||
public class MapLayerMenuItem : MapMenuItem
|
||||
{
|
||||
#if AVALONIA
|
||||
[Content]
|
||||
#endif
|
||||
public FrameworkElement MapLayer { get; set; }
|
||||
|
||||
public Func<Task<FrameworkElement>> MapLayerFactory { get; set; }
|
||||
|
||||
public MapLayerMenuItem()
|
||||
{
|
||||
Click += async (s, e) =>
|
||||
{
|
||||
if (DataContext is MapBase map)
|
||||
{
|
||||
await Execute(map);
|
||||
|
||||
foreach (var item in ParentMenuItems.OfType<MapLayerMenuItem>())
|
||||
{
|
||||
item.IsChecked = map.Children.Contains(item.MapLayer);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public virtual async Task Execute(MapBase map)
|
||||
{
|
||||
map.MapLayer = MapLayer ?? (MapLayer = await MapLayerFactory.Invoke());
|
||||
IsChecked = true;
|
||||
}
|
||||
}
|
||||
|
||||
public class MapOverlayMenuItem : MapLayerMenuItem
|
||||
{
|
||||
public override async Task Execute(MapBase map)
|
||||
{
|
||||
var layer = MapLayer ?? (MapLayer = await MapLayerFactory.Invoke());
|
||||
|
||||
if (map.Children.Contains(layer))
|
||||
{
|
||||
map.Children.Remove(layer);
|
||||
}
|
||||
else
|
||||
{
|
||||
var index = 1;
|
||||
|
||||
foreach (var itemLayer in ParentMenuItems?
|
||||
.OfType<MapOverlayMenuItem>()
|
||||
.Select(item => item.MapLayer)
|
||||
.Where(itemLayer => itemLayer != null))
|
||||
{
|
||||
if (itemLayer == layer)
|
||||
{
|
||||
map.Children.Insert(index, itemLayer);
|
||||
break;
|
||||
}
|
||||
|
||||
if (map.Children.Contains(itemLayer))
|
||||
{
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue