2010-11-30 15 views
1

LineContent座標(X1、Y1)および(X2、Y2)に似ているWPF UserControlSegmentControlを構築できますか?Line UserControlを構築する

は、私はすでにカスタムラインShapeを構築しましたが、私はそれにテキストや箇条書きのように、いくつかの追加カスタマイズ可能な要素を追加するので、私は、UserControlを必要としています。

私はいくつかのコードを構築し、私は助けが必要だと思う:

<UserControl> 
<!-- internal Canvas; The UsrCtrl Parent is supposed to be a Canvas too --> 
    <Canvas> 
     <Line x:Name="line" Stroke="Black" StrokeThickness="1"></Line> 
     <Label x:Name="label" Content="Paris - Moscow"/> 
    </Canvas> 
</UserControl> 

*ちょうどあなたが必要なポイントのユーザーコントロールにカスタムDependencyPropertyを作成し、そして結合については.cs

public partial class SegmentControl : UserControl 
{ 
    #region dependency properties 
    public static readonly DependencyProperty X1Property; 

... 
static void OnXYChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
{ 
    SegmentControl s = source as SegmentControl; 
    UpdateControlPositionAndSize(s); 
} 

static void UpdateControlPositionAndSize(SegmentControl sc) 
{ 
    double left = Math.Min(sc.X1, sc.X2); 
    double top = Math.Min(sc.Y1, sc.Y2); 

    double width = sc.X2 - sc.X1; 
    double height = sc.Y2 - sc.Y1; 

    Canvas.SetLeft(sc, left); 
    Canvas.SetTop(sc, top); 
    sc.Width = width; 
    sc.Height = height; 

    sc.line.X1 = sc.X1; // ?? 
    sc.line.Y1 = sc.Y1; // ?? 
    sc.line.X2 = sc.X2; // ??  
    sc.line.Y2 = sc.Y2; // ?? 
} 
+0

:あなたはこのような何か、それを使用することになり

<UserControl> <Canvas> <Line x:Name="line" Stroke="Black" StrokeThickness="1" X1="{Binding RelativeSource={RelativeSource AncestorType={x:Type my:SegmentControl}}, Path=StartPosition.X}" Y1="{Binding RelativeSource={RelativeSource AncestorType={x:Type my:SegmentControl}}, Path=StartPosition.Y}" X2="{Binding RelativeSource={RelativeSource AncestorType={x:Type my:SegmentControl}}, Path=EndPosition.X}" Y2="{Binding RelativeSource={RelativeSource AncestorType={x:Type my:SegmentControl}}, Path=EndPosition.Y}" /> <Label x:Name="label" Content="{Binding={RelativeSource RelativeSource AncestorType={x:Type my:SegmentControl}}, Path=Text}"/> </Canvas> </UserControl> 

?彼らはあなたのコントロールの中にあなたのセグメントの座標ですか? –

+0

@ニコラスRepiquet x1、y1、x2とy2は、それが意味する線の形と同じことを意味します。ラインの座標(私の具体的なケースでは、キャンバス) "極端な"ポイント。 – serhio

答えて

3

何あなたのラインポジションは?

あなたのユーザーコントロールは、このようなものになるだろう。この文脈でX1 Y1とX2 Y2手段を何

<my:SegmentControl 
    StartPosition="{Binding Path=StartPoint}" 
    EndPosition="{Binding Path=EndPoint}" 
    Text="{Binding Path=SegmentText}" /> 
+0

このコードはすばらしいですが、StartPosition(0,0)ではコンテナの左上隅にラインを置く必要がありますが、これはそうではありません。ラインの位置はUCからの相対位置なので、また、UC Canvas.Leftなどのプロパティをバインドする方法があるはずです。) – serhio

+0

行のX1:Y1をStartPositionにバインドするのではなく、UserControlのCanvas.Topとバインディングをバインドします。 Canvas.Left'をStartPositionに設定し、X1:Y1を0:0に設定します。ラインのX2:Y2をEndPositionにバインドしたままにしておきます – Rachel

関連する問題