Je veux dessiner un rectangle sur une toile dans WPF. Pour dessiner une ligne, je peux faire ceci:

line.X1 = ls.P0.X;
line.Y1 = ls.P0.Y;
line.X2 = ls.P1.X;
line.Y2 = ls.P1.Y;          

MyCanvas.Children.Add(line);

... en d'autres termes, l'emplacement est une propriété de la ligne elle-même . Je veux dessiner un rectangle de la même manière, c'est-à-dire attribuer ses coordonnées et l'ajouter à ma toile. Mais les exemples que j'ai vus en ligne jusqu'à présent semblent ressembler à ceci:

rect = new Rectangle
{
    Stroke = Brushes.LightBlue,
    StrokeThickness = 2
};
Canvas.SetLeft(rect,startPoint.X);
Canvas.SetTop(rect,startPoint.X);
canvas.Children.Add(rect);

... en d'autres termes, il ne semble pas que le rectangle ait un emplacement inhérent, mais à la place, son emplacement est défini en appelant une méthode de Canvas. Est-ce vrai - les lignes ont des coordonnées inhérentes mais pas les rectangles? Existe-t-il un moyen d'avoir un rectangle dans WPF avec un emplacement inhérent, comme une ligne, ou dois-je rouler le mien (en utilisant des lignes)?

0
user316117 30 déc. 2015 à 19:28

2 réponses

Meilleure réponse

Vous pouvez utiliser un contrôle Path avec un RectangleGeometry comme celui-ci:

var rect = new Path
{
    Data = new RectangleGeometry(new Rect(x, y, width, height)),
    Stroke = Brushes.LightBlue,
    StrokeThickness = 2
};
canvas.Children.Add(rect);
1
Clemens 30 déc. 2015 à 16:46

... en d'autres termes, il ne semble pas que le rectangle ait un emplacement inhérent, mais à la place, son emplacement est défini en appelant une méthode de Canvas. Est-ce vrai - les lignes ont des coordonnées inhérentes mais pas les rectangles?

Les emplacements dans WPF sont relatifs, ce qui soulève la question: coordonnées par rapport à quoi?

Line, Rectangle et Path héritent tous de Shape, et dans le cas de tout objet Shape, les coordonnées de la géométrie de définition sont relatives au coin supérieur gauche du Shape lui-même. Ainsi, lorsque vous créez un objet Line de (100, 300) à (300, 100), l'élément résultant a une taille de 300x300 points, même si la ligne visible a des limites de {{X10} }:

Line Diagram

Dans ce cas, il n'est pas nécessaire de placer le Line dans un Canvas, car vous n'utilisez pas le système de coordonnées du Canvas.

Certaines formes comme Line et Path vous permettent de placer la géométrie à toutes les coordonnées "internes" que vous souhaitez. D'autres, comme Rectangle et Ellipse, positionnent toujours leur géométrie de définition à (0, 0) en interne, vous obligeant à utiliser d'autres propriétés de mise en page pour positionner les formes dans la plus grande scène (par exemple, {{X5} }, Margin, etc.).

Dans votre exemple, si vous deviez définir un Rectangle de 200x200 points et utiliser les Canvas propriétés jointes pour positionner le rectangle en (100, 100), le {{X4} résultant } élément mesurerait 200x200, tandis que le parent Canvas se mesurerait pour être au moins 300x300, ce qui est sans doute plus intuitif:

Diagramme 1
(ombrage ajouté pour plus de clarté)

Vous avez raison de dire que c'est plutôt incohérent. Vous pouvez trouver utile de toujours utiliser les propriétés de mise en page (par exemple, Canvas.Left/Top) pour positionner les formes dans une scène de telle sorte que tous les éléments utilisent le même système de coordonnées.

0
Mike Strobel 30 déc. 2015 à 18:38