2009-06-22 8 views
0

J'essaie de faire une application de dessin et j'obtiens des résultats étranges dans mon "mode de sélection". Si je dessine un rectangle et que je le "sélectionne", RenderSize renvoie la taille appropriée, mais si la ligne est sélectionnée, RenderSize renvoie la taille dont la largeur est définie sur Line.X2 et la hauteur sur Line.Y2. Par exemple: Ligne commence à X1 = 50, Y1 = 50, se termine à X2 = 130, Y2 = 90, RenderSize renvoie Taille avec Largeur = 130 et Hauteur = 90. Ma sélection contient des éléments de type UIElement donc je ne sais pas (et ne devrait vraiment pas s'en soucier) quelle forme est sélectionnée afin de rendre mon mode de sélection aussi générique que possible et je voudrais dessiner une boîte englobante pendant que l'utilisateur déplace la forme sélectionnée.WPF - UIElement.RenderSize ne fonctionne pas pour la forme de ligne

Essayé google le problème, mais n'a rien trouvé de pertinent, alors peut-être que vous pourriez m'aider avec lui. Est-ce parce que Rectangle a une position définie par Canvas alors que Line a ses points définis explicitement?

Répondre

3

La raison pour laquelle vous obtenez 130x90 est à cause de la raison que vous avez citée. Un rectangle dans WPF est sans position, c'est juste une hauteur/largeur donc les deux valeurs de taille sont égales.

Cependant, une ligne définie par des points définit nécessairement un décalage requis par rapport à l'origine, et le décalage est donc inclus dans la zone de délimitation.

Notez également que vous pouvez continuer à utiliser les propriétés Canvas.Top/Left avec votre objet de ligne pour compenser encore il, par exemple:

<Canvas> 
    <Line X1="50" X2="130" Y1="50" Y2="90" StrokeThickness="1" Stroke="Blue" Canvas.Top="50" Canvas.Left="30"></Line> 
    </Canvas> 
+0

Alors, est-il un moyen de récupérer généralement une bonne taille (ou quelque chose comme elle) de l'UIElement et afficher la boîte de délimitation basée sur elle? Je n'aime pas l'idée de tests spéciaux et de traitements pour Line (ou toute autre forme qui a le même problème) – grapkulec

+0

Y at-il une raison particulière pour laquelle vous n'utilisez pas 0,0 comme X1, Y1? Vous auriez la bonne boîte de délimitation si c'était le cas, et utilisez Canvas.Top/Canvas.Left de la même manière que vous placez vos objets Rectangle. – micahtan

+0

Donc, vous proposez d'utiliser 0,0 comme l'un des points de la ligne et au lieu de modifier les coordonnées de ce point déplacer la ligne par Canvas.SetLeft/Canvas.SetTop methode et deuxième point? En fait, cela pourrait fonctionner, mais :) Il devrait toujours y avoir une façon plus intuitive ou élégante de le faire. – grapkulec

Questions connexes