Мы делаем то же самое для маркировки наших соединений. Если вы проводите соединение через путь, вы можете использовать
LineGeometry.GetPointAtFractionLength(0.5, out midPoint, out tangetMidPoint);
Таким образом у вас будет центральное положение на вашей геометрии. Теперь вы можете сохранить это в свойстве зависимости, которое вы используете для позиционирования метки. Конечно, это нужно вызывать каждый раз, когда ваша форма / геометрия изменяет свою позицию или размер.
небольшой пример элемента управления, объединяющего это.
public class LabeledLine : ContentControl
{
public static readonly DependencyProperty LabelPosition ...
public static readonly DependencyProperty LineGeometry ...
// call me everytime the LineGeometry gets changed.
public void UpdatePath()
{
LineGeometry.GetPointAtFractionLength(0.5, out midPoint, out tangetMidPoint);
LabelPosition = midPoint;
}
}
Ваш ControlTemplate будет выглядеть примерно так
<ControlTemplate TargetType="{x:Type local:LabeledLine}">
<Canvas x:Name="canvas">
<Path Data="{TemplateBinding LineGeometry}"/>
<TextBox Canvas.Left="{TemplateBinding LabelPosition.X}" Canvas.Top="{TemplateBinding LabelPosition.Y}"/>
</Canvas>
<ControlTemplate/>
Теперь, чтобы добавить функциональность ContentControl
, вы можете добавить ContentPresenter вместо TextBox.
В основном мне нужен объект со свойствами начальной и конечной точек, которые
имеет форму линии
Для этого просто добавьте 2 свойства ДП для ваших 2 позиций. Обязательно добавьте обработчик измененного свойства зависимости, чтобы вызвать метод UpdatePath.