Map and MapItem input handling

This commit is contained in:
ClemensFischer 2025-03-19 11:14:13 +01:00
parent 9da6a13950
commit 74d3a4adfe
8 changed files with 241 additions and 104 deletions

View file

@ -62,11 +62,24 @@ namespace MapControl
base.OnPointerWheelChanged(e);
}
protected override void OnPointerPressed(PointerPressedEventArgs e)
protected override void OnPointerMoved(PointerEventArgs e)
{
var point = e.GetCurrentPoint(this);
if (pointer1 == null && point.Pointer.Type == PointerType.Mouse && point.Properties.IsLeftButtonPressed ||
if (point.Pointer == pointer1 || point.Pointer == pointer2)
{
if (pointer2 != null)
{
HandleManipulation(point.Pointer, point.Position);
}
else if (point.Pointer.Type == PointerType.Mouse || ManipulationModes.HasFlag(ManipulationModes.Translate))
{
TranslateMap(new Point(point.Position.X - position1.X, point.Position.Y - position1.Y));
position1 = point.Position;
}
}
else if (
pointer1 == null && point.Pointer.Type == PointerType.Mouse && point.Properties.IsLeftButtonPressed && e.KeyModifiers == KeyModifiers.None ||
pointer2 == null && point.Pointer.Type == PointerType.Touch && ManipulationModes != ManipulationModes.None)
{
point.Pointer.Capture(this);
@ -83,7 +96,7 @@ namespace MapControl
}
}
base.OnPointerPressed(e);
base.OnPointerMoved(e);
}
protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e)
@ -102,26 +115,6 @@ namespace MapControl
base.OnPointerCaptureLost(e);
}
protected override void OnPointerMoved(PointerEventArgs e)
{
if (e.Pointer == pointer1 || e.Pointer == pointer2)
{
var position = e.GetPosition(this);
if (pointer2 != null)
{
HandleManipulation(e.Pointer, position);
}
else if (e.Pointer.Type == PointerType.Mouse || ManipulationModes.HasFlag(ManipulationModes.Translate))
{
TranslateMap(new Point(position.X - position1.X, position.Y - position1.Y));
position1 = position;
}
}
base.OnPointerMoved(e);
}
private void HandleManipulation(IPointer pointer, Point position)
{
var oldDistance = new Vector(position2.X - position1.X, position2.Y - position1.Y);

View file

@ -11,14 +11,28 @@
protected override void OnPointerPressed(PointerPressedEventArgs e)
{
if (e.KeyModifiers.HasFlag(KeyModifiers.Shift))
if (e.Pointer.Type == PointerType.Touch)
{
e.Handled = true;
MapItemsControl.SelectItemsInRange(this);
UpdateSelection(e);
}
else
e.Handled = true;
}
protected override void OnPointerReleased(PointerReleasedEventArgs e)
{
UpdateSelection(e);
e.Handled = true;
}
private void UpdateSelection(PointerEventArgs e)
{
if (ItemsControl.ItemsControlFromItemContainer(this) is MapItemsControl mapItemsControl)
{
base.OnPointerPressed(e);
mapItemsControl.UpdateSelection(this,
e.KeyModifiers.HasFlag(KeyModifiers.Control),
e.KeyModifiers.HasFlag(KeyModifiers.Shift));
}
}
}

View file

@ -56,5 +56,50 @@ namespace MapControl
mapItem.ClearValue(MapItem.LocationProperty);
}
}
internal void UpdateSelection(MapItem mapItem, bool controlKeyPressed, bool shiftKeyPressed)
{
if (SelectionMode != SelectionMode.Single && shiftKeyPressed)
{
SelectItemsInRange(mapItem);
}
else
{
UpdateSelection(mapItem, true, false, controlKeyPressed);
}
//var item = ItemFromContainer(mapItem);
//if (SelectionMode == SelectionMode.Single)
//{
// if (SelectedItem != item)
// {
// SelectedItem = item;
// }
// else if (controlKeyPressed)
// {
// SelectedItem = null;
// }
//}
//else if (controlKeyPressed)
//{
// if (SelectedItems.Contains(item))
// {
// SelectedItems.Remove(item);
// }
// else
// {
// SelectedItems.Add(item);
// }
//}
//else if (shiftKeyPressed)
//{
// SelectItemsInRange(mapItem);
//}
//else if (SelectedItem != item || SelectedItems.Count != 1)
//{
// SelectedItem = item;
//}
}
}
}