Dessin de cercles dans WPF
Je suis en train d'écrire une application WPF où vous pouvez dessiner des cercles sur une fenêtre en double-cliquant dessus. Pour l'instant j'ai ce code:
public class ShapeAdorner : Adorner
{
private readonly Ellipse _circle;
public ShapeAdorner(UIElement adornedElement, Point circleCenter)
: base(adornedElement)
{
_circle = new Ellipse
{
Width = 10,
Height = 10,
Stroke = Brushes.Black,
StrokeThickness = 1.5
};
_circle.Margin =
new Thickness(left: circleCenter.X, top: circleCenter.Y, right: 0, bottom: 0);
base.AddVisualChild(_circle);
}
protected override Size ArrangeOverride(Size finalSize)
{
_circle.Arrange(new Rect(finalSize));
return finalSize;
}
protected override Size MeasureOverride(Size constraint)
{
_circle.Measure(constraint);
return constraint;
}
protected override Visual GetVisualChild(int index)
{
return _circle;
}
protected override int VisualChildrenCount
{
get { return 1; }
}
}
Voici le code de client:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myLabel);
adornerLayer.Add(new ShapeAdorner(adornedElement: myLabel, circleCenter: e.GetPosition(myLabel)));
}
}
Les cercles sont censé être centré sur le point où vous double-cliquez sur la fenêtre; toutefois, les cercles dessinés par le code ci-dessus sont, centré au-dessous et à droite de "la double cliquez sur le point". Comment cela peut-il être fixé?
EDIT: myLabel
a Height=350
et Width=525
. Disons que j'ai double-cliquez sur le point (X,Y)
; puis le cercle devient tracé à ((350+X)/2,(525+Y)/2)
.
EDIT 2: Juste pour être complet, voici la .fichier xaml:
<Window x:Class="Adorners.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Adorners project" Height="350" Width="525" MouseDoubleClick="Window_MouseDoubleClick">
<Grid>
<Label Name="myLabel" Content="my label" Background="Red"></Label>
</Grid>
</Window>
est-il vraiment trop loin vers la gauche? si vous n'êtes pas de compensation pour le cercle dimensions, il devrait être de loin à droite. si c'est vraiment de loin à droite, vous devez utiliser la soustraction sur les deux dimensions, sinon utiliser mon awnser
Mon erreur, j'ai corrigé ce "droit".
Merci à Kent Boogaart, H. B., et aL3891 pour répondre. Cependant, je ne pense pas que vous avez tout à fait "cloué". Les cercles ne sont pas compensés par une constante; voir le "MODIFIER" une partie de ma question pour plus de détails.
Mon erreur, j'ai corrigé ce "droit".
Merci à Kent Boogaart, H. B., et aL3891 pour répondre. Cependant, je ne pense pas que vous avez tout à fait "cloué". Les cercles ne sont pas compensés par une constante; voir le "MODIFIER" une partie de ma question pour plus de détails.
OriginalL'auteur user181813 | 2011-06-28
Vous devez vous connecter pour publier un commentaire.
Où vous définissez la marge, vous devez soustraire le rayon de l'propriétés top et left pour compenser le cercle.
OriginalL'auteur H.B.
Vous aurez besoin de compenser par la moitié de la largeur/hauteur du cercle. Codé en dur ici pour le rendre facile à suivre:
OriginalL'auteur Kent Boogaart
Vous avez besoin de prendre le witdth et la hauteur en conserderation lors de la configuration de la marge. le sommet devrait être l'centerposition moins de la moitié de la hauteur, et de même pour le gauche:
Il s'avère que c'était en fait de loin à droite, pas loin vers la gauche. donc la soustraction doit être utilisé sur les deux dimensions, comme dans tout le monde elses awnser 🙂
OriginalL'auteur aL3891
Les réponses précédentes sont correctes. Cependant, le principal problème était que j'avais omis ces deux lignes:
_circle.HorizontalAlignment = HorizontalAlignment.Left;
_circle.VerticalAlignment = VerticalAlignment.Top;
La valeur par défaut
Stretch
a causé une énorme erreur de décalage.OriginalL'auteur user181813