Реализация Stretch="Fill" для пользовательского элемента фреймворка в WPF
У меня есть пользовательский элемент каркаса, который является двойным к Polyline. Этот элемент предназначен для рисования маркеров в местах расположения точек полилинии и будет действовать как наложение.
Я успешно нарисовал точки, но затрудняюсь реализовать способ Stretch="Fill", который есть у таких нормалей, как Polyline. Мой код для класса ниже.
Если бы кто-нибудь мог рассказать мне о том, как добавить к этому функцию Stretch, я был бы признателен.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ReactiveUI;
namespace Weingartner.WPF
{
public class PolyMarkers : FrameworkElement
{
static PolyMarkers()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(PolyMarkers), new FrameworkPropertyMetadata(typeof(PolyMarkers)));
}
public PointCollection Points
{
get { return (PointCollection)GetValue(PointsProperty); }
set { SetValue(PointsProperty, value); }
}
// Using a DependencyProperty as the backing store for Points. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PointsProperty =
DependencyProperty.Register(
"Points",
typeof(PointCollection),
typeof(PolyMarkers),
new PropertyMetadata(new PointCollection()));
private VisualCollection Children;
public PolyMarkers()
{
this.WhenAny(t => t.Points, x =>
{
return x.Value.Select(p =>
{
return CreateDrawingVisualEllipses(p, 10, 10);
});
}).Subscribe(x =>
{
foreach (var shape in x)
{
AddVisualChild(shape);
}
InvalidateMeasure();
InvalidateArrange();
InvalidateVisual();
});
}
private DrawingVisual CreateDrawingVisualEllipses(Point location, int dx, int dy)
{
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
drawingContext.DrawEllipse(Brushes.Maroon, null, location, dx, dy);
drawingContext.Close();
return drawingVisual;
}
// Provide a required override for the VisualChildrenCount property.
protected override int VisualChildrenCount
{
get { return Children.Count; }
}
// Provide a required override for the GetVisualChild method.
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= Children.Count)
{
throw new ArgumentOutOfRangeException();
}
return Children[index];
}
}
}
1 ответ
Самое простое, что нужно сделать, это обернуть Viewbox
вокруг всего содержимого вашего элемента, и пусть он обрабатывает масштабирование для вас. Если вы хотите сделать это на более низком уровне внутри вашего элемента управления, вам нужно переопределить все методы Measure и Arrange и выполнить все масштабирование вручную, что может быть большой (очень подверженной ошибкам) работой.