2011-08-25 7 views
0

선을 그려야하고 두 번 클릭하면 텍스트를 넣고 싶습니다. 나는 그것을 contentcontrol에 넣고 선을 그려 넣고, 붕괴 된 텍스트 상자를 맨 위에 놓고, 두 번 클릭을 감지하고, 텍스트 상자에 텍스트 블록을 설정하는 등의 작업을 생각하고있었습니다. 내가 겪는 유일한 문제는 무엇을해야할지 모르겠습니다. contentcontrol 안에 있기 때문에 선의 좌표를 설정하면 실제 선이 그려집니다. 나는 몇 시간 동안 붙어 있었고, 어떤 도움을 주시면 감사하겠습니다.텍스트 상자가있는 커넥터 선 바인딩 문제

기본적으로 콘텐츠 시작자가있는 선 모양의 시작 및 끝점 속성을 가진 개체가 필요합니다. 그러나 나는 이것을하는 방법에 대해 어떻게 해야할지 모르겠다. 모든 포인터는 감사하겠습니다.

답변

1

우리는 우리의 연결을 라벨링하기 위해 동일한 작업을 수행합니다. 사용할 수있는 경로를 통해 연결을 그릴 경우

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은 이제 텍스트 상자 대신에 ContentPresenter에 추가 할 수있는 ContentControl 기능을 추가하는

<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/> 

처럼 보일 것입니다.

는 기본적으로 나는 그냥 2 개 위치에 대한 2 개 DP 속성을 추가 것을 들어 줄

의 모양을 가지고 시작 및 종료 지점 특성을 가진 개체가 필요합니다. 종속성 속성 변경 처리기를 추가하여 UpdatePath 메서드를 호출해야합니다.

+0

괜찮아요, 고맙습니다. – mihajlv