Соединительные линии с текстовым полем, проблема с переплетом - PullRequest
0 голосов
/ 25 августа 2011

Я хочу нарисовать линию, и когда я дважды щелкаю по ней, я хочу поместить текст на нее.Я думал о том, чтобы поместить его в управление контентом и нарисовать линию, поместить свернутое текстовое поле сверху, обнаружить двойной щелчок, показать текстовое поле, установить его в текстовом блоке и т. Д. Единственная проблема, с которой я столкнулся, не знаю, что делатьустановите координаты линии, так как она находится внутри contentcontrol, чтобы нарисовать реальную линию.Я застрял на несколько часов, любая помощь будет признательна.

В основном мне нужен объект со свойствами начальной и конечной точки, который имеет форму линии, с предъявителем контента.Но я не знаю, как это сделать.Любые указатели будут оценены.

1 Ответ

1 голос
/ 25 августа 2011

Мы делаем то же самое для маркировки наших соединений. Если вы проводите соединение через путь, вы можете использовать

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.

...