Das zeichnen von Kreisen in WPF
Ich bin versucht zu schreiben, eine WPF-Anwendung, wo Sie können, zeichnen Sie Kreise auf ein Fenster, indem Sie darauf doppelklicken. Bisher habe ich diesen 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; }
}
}
Hier ist der client-code:
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)));
}
}
Den Kreisen sollen zentriert sein und an der Stelle, wo Sie einen Doppelklick auf das Fenster; aber die Kreise gezeichnet, indem der code oben zentriert unten und rechts von der Doppel-klicken Sie auf Punkt". Wie kann dies behoben werden?
EDIT: myLabel
hat Height=350
und Width=525
. Lassen Sie uns sagen, dass ich Doppel-klicken Sie auf den Punkt (X,Y)
; dann ist der Kreis wird gezeichnet bei ((350+X)/2,(525+Y)/2)
.
EDIT 2: Nur der Vollständigkeit halber, hier die .der xaml-Datei:
<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>
Mein Fehler - ich habe korrigiert "rechts".
Dank Kent Boogaart, H. B., und aL3891 für die Beantwortung. Aber ich glaube nicht, dass du ziemlich "festgenagelt". Die Kreise werden nicht kompensiert durch eine Konstante; siehe den "EDIT" - Teil meiner Frage.
InformationsquelleAutor user181813 | 2011-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wo Sie die Marge, die Sie haben zu subtrahieren Sie den radius von den Eigenschaften top und left offset Kreis.
InformationsquelleAutor H.B.
Müssen Sie offset um die halbe Breite/Höhe des Kreises. Hart-codiert, um es einfach zu Folgen:
InformationsquelleAutor Kent Boogaart
Brauchen Sie, um die Breite und Höhe in conserderation, wenn Sie die Einstellung der Marge. die Spitze sollte auf der Mittelstellung dann minus der Hälfte der Höhe, und das gleiche für die Links:
Stellt sich heraus, es war eigentlich zu weit rechts, nicht zu weit Links. also die Subtraktion verwendet werden sollte, die auf beiden Dimensionen als in jedermanns elses awnser 🙂
InformationsquelleAutor aL3891
Den vorherigen Antworten sind korrekt. Jedoch, die größte problem war, dass ich versäumt hatte, diese beiden Zeilen:
_circle.HorizontalAlignment = HorizontalAlignment.Left;
_circle.VerticalAlignment = VerticalAlignment.Top;
Den default-Wert
Stretch
verursacht einen riesigen Fehler auszugleichen.InformationsquelleAutor user181813