XAML-Map-Control/MapControl/Shared/MapItemsControl.cs

176 lines
5.2 KiB
C#
Raw Normal View History

// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control
2021-01-13 21:19:27 +01:00
// © 2021 Clemens Fischer
// Licensed under the Microsoft Public License (Ms-PL)
2018-11-13 21:35:48 +01:00
using System;
2021-06-14 21:41:37 +02:00
#if WINUI
using Windows.Foundation;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Data;
2021-11-17 23:17:11 +01:00
#elif UWP
2018-11-13 21:35:48 +01:00
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;
2017-09-05 20:57:17 +02:00
#else
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
2017-09-05 20:57:17 +02:00
#endif
namespace MapControl
{
/// <summary>
/// Container class for an item in a MapItemsControl.
/// </summary>
public partial class MapItem : ListBoxItem
{
public static readonly DependencyProperty LocationMemberPathProperty = DependencyProperty.Register(
nameof(LocationMemberPath), typeof(string), typeof(MapItem),
new PropertyMetadata(null, (o, e) => BindingOperations.SetBinding(
o, LocationProperty, new Binding { Path = new PropertyPath((string)e.NewValue) })));
2021-01-13 00:08:55 +01:00
/// <summary>
2021-01-16 18:32:31 +01:00
/// Gets/sets MapPanel.AutoCollapse.
2021-01-13 00:08:55 +01:00
/// </summary>
public bool AutoCollapse
{
get { return (bool)GetValue(AutoCollapseProperty); }
set { SetValue(AutoCollapseProperty, value); }
}
/// <summary>
2021-01-16 18:32:31 +01:00
/// Gets/sets MapPanel.Location.
2021-01-13 00:08:55 +01:00
/// </summary>
public Location Location
{
get { return (Location)GetValue(LocationProperty); }
set { SetValue(LocationProperty, value); }
}
2021-01-13 00:08:55 +01:00
/// <summary>
/// Path to a source property for binding the Location property.
/// </summary>
public string LocationMemberPath
{
get { return (string)GetValue(LocationMemberPathProperty); }
set { SetValue(LocationMemberPathProperty, value); }
}
}
2017-09-05 20:57:17 +02:00
/// <summary>
/// Manages a collection of selectable items on a Map.
/// </summary>
2018-11-13 21:35:48 +01:00
public partial class MapItemsControl : ListBox
{
protected override DependencyObject GetContainerForItemOverride()
{
return new MapItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is MapItem;
}
2020-10-21 22:18:16 +02:00
public void SelectItems(Predicate<object> predicate)
2018-11-13 21:35:48 +01:00
{
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);
}
}
}
}
2020-10-21 22:18:16 +02:00
public void SelectItemsByLocation(Predicate<Location> predicate)
2018-11-13 21:35:48 +01:00
{
SelectItems(item =>
{
2018-11-14 17:53:37 +01:00
var loc = MapPanel.GetLocation(ContainerFromItem(item));
2018-11-13 21:35:48 +01:00
return loc != null && predicate(loc);
});
}
2020-10-21 22:18:16 +02:00
public void SelectItemsByPosition(Predicate<Point> predicate)
2018-11-13 21:35:48 +01:00
{
SelectItems(item =>
{
var pos = MapPanel.GetViewPosition(ContainerFromItem(item));
2018-11-13 21:35:48 +01:00
return pos.HasValue && predicate(pos.Value);
});
}
public void SelectItemsInRect(Rect rect)
{
SelectItemsByPosition(p => rect.Contains(p));
}
2018-11-14 17:53:37 +01:00
protected internal void OnItemClicked(FrameworkElement mapItem, bool controlKey, bool shiftKey)
{
2018-11-14 17:53:37 +01:00
var item = ItemFromContainer(mapItem);
2018-11-13 21:35:48 +01:00
if (SelectionMode == SelectionMode.Single)
{
// Single -> set only SelectedItem
if (SelectedItem != item)
{
SelectedItem = item;
}
else if (controlKey)
{
SelectedItem = null;
}
}
else if (SelectionMode == SelectionMode.Multiple || controlKey)
{
// Multiple or Extended with Ctrl -> toggle item in SelectedItems
if (SelectedItems.Contains(item))
{
SelectedItems.Remove(item);
}
else
{
SelectedItems.Add(item);
}
}
else if (shiftKey && SelectedItem != null)
{
// Extended with Shift -> select items in view rectangle
2018-11-13 21:35:48 +01:00
var p1 = MapPanel.GetViewPosition(ContainerFromItem(SelectedItem));
var p2 = MapPanel.GetViewPosition(mapItem);
2018-11-13 21:35:48 +01:00
if (p1.HasValue && p2.HasValue)
{
SelectItemsInRect(new Rect(p1.Value, p2.Value));
}
}
else if (SelectedItem != item)
{
// Extended without Control or Shift -> set selected item
SelectedItem = item;
}
}
}
}