2010-10-30 21 views
0

J'ai un canevas qui contient des contrôles utilisateur spécifiques.Lier une position de ligne à la position d'un élément dans un contrôle utilisateur

À un certain point, je veux ajouter une ligne au canevas (en code) où l'un des points est lié à la position d'un élément dans un usercontrol. L'usercontrol est dynamique, donc les éléments peuvent changer de position.

Le usercontrol contient une mise en page avec des grilles, etc. stackpanels que l'élément peut être situé dans.

Pour le usercontrol, je reçois la propriété Canvas.Left et Canvas.Top, mais depuis que je don ne veux pas se lier à l'usercontrol mais à un élément qu'il contient, comment ferais-je cela? (D'une certaine manière que si les changements de mise en page de UserControl, la nouvelle position de l'élément est pris en compte)

Répondre

1

Nous allons stipuler qu'il ya 3 choses ici:

« ligne » est lié à « Enfant "Qui est contenu par " Parent ".

Ligne doit définir ses Canvas.Top et Canvas.Left à une liaison sur l'enfant, en utilisant un ValueConverter qui doit avoir accès à Parent.

Le ValueConverter retournera Parent.Left + Child.GetPosition (Parent) .Left

(ou quelles que soient les méthodes de consultation sont exactes). L'important est que l'enfant obtienne sa position par rapport au parent, et ajoute dans la position du parent.

(Développant poster un commentaire) Vous spécifiez une ligne de cette façon:

<Line X1="50" Y1="50" X2="200" Y2="200" /> 

Ce qui signifie que vous appliquez un liant à chacune de ces coordonnées spécificateurs. Probablement votre meilleur pari est de passer le X ou Y au ValueConverter en tant que ConverterParameter, pour vous éviter d'écrire trop de code en double.

Votre question d'origine indique que vous recherchez X1, Y1. Je ne sais pas ce que vous voulez que l'autre bout de la ligne soit, on dirait que c'est réparé quelque part. Ou si vous allez à un autre élément, vous faites essentiellement le même tour - cela ne fonctionnera que pour un seul point. Supposons pour l'instant que vous voulez toujours que l'autre point soit 100 100.

Ainsi, votre ligne est spécifiée comme ceci:

<Line X1="{Binding ElementName=yourTarget, ConverterParameter=X, Converter={StaticResource targetLocationExtractor}}" Y1="{Binding ElementName=yourTarget, ConverterParameter=Y, Converter={StaticResource targetLocationExtractor}}" X2="200" Y2="200" /> 
+0

Merci pour votre réponse. Une ligne WPF a des points X1, Y1-X2, Y2 qui devraient être liés. Pouvez-vous élaborer un peu plus sur la façon dont je ferais cela? – Pygmy

+0

À la vôtre, j'ai été capable de comprendre à l'aide de convertisseurs! – Pygmy