2010-09-20 8 views
2

Je suis nouveau dans WPF, j'ai créé un nouveau UserControl MyUserControl.Emplacement UserControl dans WPF

Maintenant, je suis surpris: le UserContol n'a pas d'emplacement.

Comment puis-je lire (par code) myUserControl1. Location dans le conteneur parent?

J'explique:

J'ai quelques points (UserControls) que l'utilisateur peut glisser dans un panneau. En fait, je ne suis pas sûr de quel genre de panneau ce sera ... Peut-être Grille.

Maintenant, ces points doivent être liés à une ligne. En fait, j'ai des propriétés Dot.Head et Dot.Queue (également des points) Donc, quand une tête ou une file d'attente est ajoutée, j'ai besoin de créer dinamiquement un lien (ligne) entre eux [A] ----- [B]. C'est pour cette ligne que je recherche les points de départ et de fin à définir.

contrôle XAML:

<UserControl x:Class="LinePlan.Stop" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" d:DesignHeight="21" d:DesignWidth="80"> 
    <Canvas> 
     <Path Fill="LightBlue" Width="16" Height="16"> 
      <Path.Data> 
       <EllipseGeometry x:Name="Dot" Center="8,8" 
        RadiusX="4" RadiusY="4"/> 
      </Path.Data> 
     </Path> 
     <TextBlock x:Name="StopText" Text="Eiffel Tower" Canvas.Left="16"/> 
    </Canvas> 
</UserControl> 

code:

public partial class Stop : UserControl 
{ 
    private Stop head; 
    private Stop tail; 
    private LineGeometry headLine; 
    private LineGeometry queueLine; 

    public Stop() 
    { 
     InitializeComponent(); 
    } 

    public Stop Head 
    { 
     get { return head; } 
     set 
     { 
      if (head != value) 
      { 
       head = value; 
       if (head == null) 
       { 
        if (headLine != null) 
         headLine = null; 
       } 
       else 
       { 
        headLine = new LineGeometry(); 
        headLine.StartPoint = head.DotPosition; 
        headLine.EndPoint = this.DotPosition; 

        // ?? Add this line to the parent 
       } 

      } 
     } 
    } 

    public Stop Tail 
    { 
     get { return tail; } 
     set { tail = value; } 
    } 

    public Point DotPosition 
    { 
     get 
     { 
      double x = Canvas.GetLeft(this) + this.Dot.Center.X; 
      double y = Canvas.GetTop(this) + this.Dot.Center.Y; 
      return new Point(x, y); 
     } 
     set 
     { 
      Canvas.SetLeft(this, value.X - this.Dot.Center.X); 
      Canvas.SetTop(this, value.Y - this.Dot.Center.Y); 
     } 
    } 
} 
+0

le mot "file d'attente" est un faux-ami * * ... Je pense que le mot que vous cherchez est "queue";) –

+0

@ Thomas: bonne remarque – serhio

Répondre

3

Le système de mise en page WPF ne le fait pas utilisez le positionnement absolu, sauf si vous placez vos contrôles sur un conteneur qui prend en charge le positionnement absolu (généralement un). 210). Si vous utilisez un Canvas, vous pouvez obtenir ou définir la position de la commande à l'aide des Canvas.Left, Canvas.Right, Canvas.Top et Canvas.Bottom propriétés attachées:

double x = Canvas.GetLeft(myControl); 
double y = Canvas.GetTop(myControl); 

Maintenant, si vous voulez que l'emplacement réel de la commande (par rapport à son parent), vous pouvez utiliser la méthode VisualTreeHelper.GetOffset:

Vector offset = VisualTreeHelper.GetOffset(myControl); 
double x = offset.X; 
double y = offset.Y; 
+0

merci. J'ai ajouté une petite explication dans le sujet. – serhio

+0

Selon votre explication, je pense que le seul panneau candidat pour vous est Canvas ...Je –

+0

ajouté le code réel ... NAN est retourné comme positions, au moins en mode de conception ... – serhio

1

éléments (comme les contrôles utilisateur) sont normalement placés dans les panneaux en WPF. Selon le panneau que vous utilisez, le panneau peut ajouter des propriétés attachées au contrôle utilisateur. Si le contrôle utilisateur est placé dans un Canvas il obtiendra les propriétés ci-joint Left, Top, Right et Bottom. Cependant, si le contrôle utilisateur est placé dans un Grid, il obtiendra les propriétés jointes et Column (et quelques autres). D'autres panneaux, tels que StackPanel, n'attachent aucune propriété. Il n'existe pas d'emplacement de contrôle utilisateur universel.

Panels Overview

Attached Properties Overview

En supposant que vous utilisez un Canvas que votre panneau, vous pouvez accéder aux attachés Left et Top propriétés comme ceci:

Double x = Canvas.GetLeft(myUserControl1); 
Double y = Canvas.GetTop(myUserControl1);