XAML-Map-Control/MapControl/WinUI/PushpinBorder.WinUI.cs

94 lines
2.8 KiB
C#

// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control
// © 2022 Clemens Fischer
// Licensed under the Microsoft Public License (Ms-PL)
using Windows.Foundation;
#if WINUI
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Markup;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Shapes;
#else
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Markup;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Shapes;
#endif
namespace MapControl
{
[ContentProperty(Name = "Child")]
public partial class PushpinBorder : UserControl
{
public static readonly DependencyProperty ArrowSizeProperty = DependencyProperty.Register(
nameof(ArrowSize), typeof(Size), typeof(PushpinBorder),
new PropertyMetadata(new Size(10d, 20d), (o, e) => ((PushpinBorder)o).SetBorderMargin()));
public static readonly DependencyProperty BorderWidthProperty = DependencyProperty.Register(
nameof(BorderWidth), typeof(double), typeof(PushpinBorder),
new PropertyMetadata(0d, (o, e) => ((PushpinBorder)o).SetBorderMargin()));
private readonly Border border = new Border();
public PushpinBorder()
{
var path = new Path
{
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch,
Stretch = Stretch.None
};
path.SetBinding(Shape.FillProperty, new Binding
{
Path = new PropertyPath(nameof(Background)),
Source = this
});
path.SetBinding(Shape.StrokeProperty, new Binding
{
Path = new PropertyPath(nameof(BorderBrush)),
Source = this
});
path.SetBinding(Shape.StrokeThicknessProperty, new Binding
{
Path = new PropertyPath(nameof(BorderWidth)),
Source = this
});
border.SetBinding(PaddingProperty, new Binding
{
Path = new PropertyPath(nameof(Padding)),
Source = this
});
SetBorderMargin();
var grid = new Grid();
grid.Children.Add(path);
grid.Children.Add(border);
Content = grid;
SizeChanged += (s, e) => path.Data = BuildGeometry();
}
public UIElement Child
{
get { return border.Child; }
set { border.Child = value; }
}
private void SetBorderMargin()
{
border.Margin = new Thickness(
BorderWidth, BorderWidth, BorderWidth, BorderWidth + ArrowSize.Height);
}
}
}