mirror of
https://github.com/ClemensFischer/XAML-Map-Control.git
synced 2025-12-06 07:12:04 +01:00
118 lines
3.3 KiB
C#
118 lines
3.3 KiB
C#
// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control
|
|
// Copyright © 2024 Clemens Fischer
|
|
// Licensed under the Microsoft Public License (Ms-PL)
|
|
|
|
using System;
|
|
#if WPF
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
#elif UWP
|
|
using Windows.UI.Xaml;
|
|
using Windows.UI.Xaml.Controls;
|
|
#elif WINUI
|
|
using Microsoft.UI.Xaml;
|
|
using Microsoft.UI.Xaml.Controls;
|
|
#endif
|
|
|
|
namespace MapControl
|
|
{
|
|
/// <summary>
|
|
/// An ItemsControl with selectable items on a Map. Uses MapItem as item container.
|
|
/// </summary>
|
|
public partial class MapItemsControl : ListBox
|
|
{
|
|
public static readonly DependencyProperty LocationMemberPathProperty =
|
|
DependencyPropertyHelper.Register<MapItemsControl, string>(nameof(LocationMemberPath));
|
|
|
|
/// <summary>
|
|
/// Path to a source property for binding the Location property of MapItem containers.
|
|
/// </summary>
|
|
public string LocationMemberPath
|
|
{
|
|
get => (string)GetValue(LocationMemberPathProperty);
|
|
set => SetValue(LocationMemberPathProperty, value);
|
|
}
|
|
|
|
public void SelectItems(Predicate<object> predicate)
|
|
{
|
|
if (SelectionMode == SelectionMode.Single)
|
|
{
|
|
throw new InvalidOperationException("SelectionMode must not be Single");
|
|
}
|
|
|
|
foreach (var item in Items)
|
|
{
|
|
var selected = predicate(item);
|
|
|
|
if (selected != SelectedItems.Contains(item))
|
|
{
|
|
if (selected)
|
|
{
|
|
SelectedItems.Add(item);
|
|
}
|
|
else
|
|
{
|
|
SelectedItems.Remove(item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SelectItemsByLocation(Predicate<Location> predicate)
|
|
{
|
|
SelectItems(item =>
|
|
{
|
|
var location = MapPanel.GetLocation(ContainerFromItem(item));
|
|
|
|
return location != null && predicate(location);
|
|
});
|
|
}
|
|
|
|
public void SelectItemsByPosition(Predicate<Point> predicate)
|
|
{
|
|
SelectItems(item =>
|
|
{
|
|
var pos = MapPanel.GetViewPosition(ContainerFromItem(item));
|
|
return pos.HasValue && predicate(pos.Value);
|
|
});
|
|
}
|
|
|
|
public void SelectItemsInRect(Rect rect)
|
|
{
|
|
SelectItemsByPosition(p => rect.Contains(p));
|
|
}
|
|
|
|
protected internal void OnItemClicked(MapItem mapItem, bool controlKey)
|
|
{
|
|
var item = ItemFromContainer(mapItem);
|
|
|
|
if (SelectionMode == SelectionMode.Single)
|
|
{
|
|
if (SelectedItem != item)
|
|
{
|
|
SelectedItem = item;
|
|
}
|
|
else if (controlKey)
|
|
{
|
|
SelectedItem = null;
|
|
}
|
|
}
|
|
else if (controlKey)
|
|
{
|
|
if (SelectedItems.Contains(item))
|
|
{
|
|
SelectedItems.Remove(item);
|
|
}
|
|
else
|
|
{
|
|
SelectedItems.Add(item);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ResetSelectedItems(item);
|
|
}
|
|
}
|
|
}
|
|
}
|