2010-11-30 4 views
1

Est-il possible de construire un WPF UserControlSegmentControl, ayant des similitudes avec les coordonnées de forme de ligne (X1, Y1) et (X2, Y2)?Construire une ligne UserControl

Je l'ai déjà construit une ligne personnalisée Shape, mais je besoin d'un UserControl, parce que je rajoute quelques éléments personnalisables supplémentaires, comme du texte et des balles à elle.

je construit un code, mais pense que je besoin d'aide:

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

* .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

Qu'est-ce que X1 et X2 Y1 Y2 signifie dans ce contexte? Sont-ils les coordonnées de votre segment à l'intérieur de votre contrôle? –

+0

@Nicolas Repiquet x1, y1, x2 et y2 signifie la même chose que pour une forme de ligne que cela signifie. les coordonnées de la ligne (dans mon cas concret dans un canevas) des points "extrêmes". – serhio

Répondre

3

Qu'en est-il juste créer une coutume DependencyProperty sur le UserControl des points dont vous avez besoin, et la liaison votre position de ligne à elle?

Votre UserControl serait quelque chose comme ceci:

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

On peut l'utiliser quelque chose comme ceci:

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

ce code est cool, cependant, avec StartPosition (0,0) la ligne devrait être dans le coin supérieur gauche du conteneur ..., mais ce n'est pas le cas, parce que la position "line" est relative à UC, mais la StartPosition - pour le parent UC., De plus, il devrait y avoir un moyen de lier les propriétés UC Canvas.Left etc ...) – serhio

+0

Au lieu de lier la ligne X1: Y1 à StartPosition, lier 'Canvas.Top' de UserControl et' Canvas.Left' à StartPosition et définissez X1: Y1 sur 0: 0. Laisser le X2: Y2 de la ligne lié à l'EndPosition – Rachel