mirror of
https://github.com/ClemensFischer/XAML-Map-Control.git
synced 2025-12-06 07:12:04 +01:00
Added MapItemsControl.SelectionGeometry property for WPF.
This commit is contained in:
parent
4fbc5bc00c
commit
ac6f9d5647
|
|
@ -12,22 +12,17 @@ namespace MapControl
|
|||
{
|
||||
partial void Initialize()
|
||||
{
|
||||
#if !SILVERLIGHT
|
||||
ManipulationDelta += OnManipulationDelta;
|
||||
#endif
|
||||
MouseWheel += OnMouseWheel;
|
||||
MouseLeftButtonDown += OnMouseLeftButtonDown;
|
||||
MouseLeftButtonUp += OnMouseLeftButtonUp;
|
||||
MouseMove += OnMouseMove;
|
||||
}
|
||||
|
||||
#if !SILVERLIGHT
|
||||
private void OnManipulationDelta(object sender, ManipulationDeltaEventArgs e)
|
||||
{
|
||||
var d = e.DeltaManipulation;
|
||||
TransformMap(e.ManipulationOrigin, (Point)d.Translation, d.Rotation, (d.Scale.X + d.Scale.Y) / 2d);
|
||||
}
|
||||
ManipulationDelta += (o, e) => TransformMap(
|
||||
e.ManipulationOrigin, (Point)e.DeltaManipulation.Translation, e.DeltaManipulation.Rotation,
|
||||
(e.DeltaManipulation.Scale.X + e.DeltaManipulation.Scale.Y) / 2d); ;
|
||||
#endif
|
||||
}
|
||||
|
||||
private void OnMouseWheel(object sender, MouseWheelEventArgs e)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,12 +2,6 @@
|
|||
// Copyright © 2012 Clemens Fischer
|
||||
// Licensed under the Microsoft Public License (Ms-PL)
|
||||
|
||||
#if WINRT
|
||||
using Windows.UI.Xaml;
|
||||
#else
|
||||
using System.Windows;
|
||||
#endif
|
||||
|
||||
namespace MapControl
|
||||
{
|
||||
public partial class MapItemsControl
|
||||
|
|
|
|||
|
|
@ -3,13 +3,21 @@
|
|||
// Licensed under the Microsoft Public License (Ms-PL)
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace MapControl
|
||||
{
|
||||
public partial class MapItemsControl
|
||||
{
|
||||
public static readonly DependencyProperty SelectionGeometryProperty = DependencyProperty.Register(
|
||||
"SelectionGeometry", typeof(Geometry), typeof(MapItemsControl),
|
||||
new PropertyMetadata((o, e) => ((MapItemsControl)o).SelectionGeometryPropertyChanged((Geometry)e.NewValue)));
|
||||
|
||||
public static readonly DependencyProperty IsCurrentProperty = DependencyProperty.RegisterAttached(
|
||||
"IsCurrent", typeof(bool), typeof(MapItemsControl), null);
|
||||
|
||||
|
|
@ -25,14 +33,35 @@ namespace MapControl
|
|||
Items.CurrentChanged += OnCurrentItemChanged;
|
||||
}
|
||||
|
||||
public Geometry SelectionGeometry
|
||||
{
|
||||
get { return (Geometry)GetValue(SelectionGeometryProperty); }
|
||||
set { SetValue(SelectionGeometryProperty, value); }
|
||||
}
|
||||
|
||||
public static bool GetIsCurrent(UIElement element)
|
||||
{
|
||||
return (bool)element.GetValue(IsCurrentProperty);
|
||||
}
|
||||
|
||||
private static void SetIsCurrent(UIElement element, bool value)
|
||||
public object GetFirstItemInGeometry(Geometry geometry)
|
||||
{
|
||||
element.SetValue(IsCurrentProperty, value);
|
||||
if (geometry == null || geometry.IsEmpty())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return Items.Cast<object>().FirstOrDefault(i => IsItemInGeometry(i, geometry));
|
||||
}
|
||||
|
||||
public IList<object> GetItemsInGeometry(Geometry geometry)
|
||||
{
|
||||
if (geometry == null || geometry.IsEmpty())
|
||||
{
|
||||
return new List<object>();
|
||||
}
|
||||
|
||||
return new List<object>(Items.Cast<object>().Where(i => IsItemInGeometry(i, geometry)));
|
||||
}
|
||||
|
||||
private void OnCurrentItemChanging(object sender, CurrentChangingEventArgs e)
|
||||
|
|
@ -41,7 +70,7 @@ namespace MapControl
|
|||
|
||||
if (container != null)
|
||||
{
|
||||
SetIsCurrent(container, false);
|
||||
container.SetValue(IsCurrentProperty, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -51,8 +80,43 @@ namespace MapControl
|
|||
|
||||
if (container != null)
|
||||
{
|
||||
SetIsCurrent(container, true);
|
||||
container.SetValue(IsCurrentProperty, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void SelectionGeometryPropertyChanged(Geometry geometry)
|
||||
{
|
||||
if (SelectionMode == SelectionMode.Single)
|
||||
{
|
||||
SelectedItem = GetFirstItemInGeometry(geometry);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSelectedItems(GetItemsInGeometry(geometry));
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsItemInGeometry(object item, Geometry geometry)
|
||||
{
|
||||
var container = ContainerFromItem(item);
|
||||
if (container == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var location = MapPanel.GetLocation(container);
|
||||
if (location == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var parentMap = MapPanel.GetParentMap(container);
|
||||
if (parentMap == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return geometry.FillContains(parentMap.LocationToViewportPoint(location));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,7 +14,8 @@ namespace MapControl
|
|||
{
|
||||
/// <summary>
|
||||
/// Manages a collection of selectable items on a Map. Uses MapItem as container for items
|
||||
/// and updates the IsCurrent attached property when the Items.CurrentItem property changes.
|
||||
/// and (for WPF only) updates the IsCurrent attached property on each MapItem when the
|
||||
/// Items.CurrentItem property changes.
|
||||
/// </summary>
|
||||
public partial class MapItemsControl : ListBox
|
||||
{
|
||||
|
|
|
|||
|
|
@ -104,9 +104,9 @@
|
|||
<EllipseGeometry RadiusX="8" RadiusY="8"/>
|
||||
</Path.Data>
|
||||
</Path>
|
||||
<Grid Canvas.Left="10" Canvas.Bottom="3">
|
||||
<Grid Canvas.Left="15" Canvas.Top="-8">
|
||||
<Rectangle Name="labelBackground" Fill="White" Opacity="0.7"/>
|
||||
<TextBlock Margin="2,0,2,1" Text="{Binding Name}"/>
|
||||
<TextBlock Margin="2,0,2,0" Text="{Binding Name}"/>
|
||||
</Grid>
|
||||
</Canvas>
|
||||
</ControlTemplate>
|
||||
|
|
|
|||
Loading…
Reference in a new issue