Рисование кругов в WPF - PullRequest
4 голосов
/ 28 июня 2011

Я пытаюсь написать приложение WPF, в котором вы можете рисовать круги в окне, дважды щелкнув по нему. Пока у меня есть этот код:

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; }
    }
}

Вот код клиента:

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)));
    } 
}

Круги должны быть центрированы в точке, где вы дважды щелкнете по окну; однако круги, нарисованные приведенным выше кодом, центрированы ниже и справа от «точки двойного щелчка». Как это можно исправить?

РЕДАКТИРОВАТЬ: myLabel имеет Height=350 и Width=525. Допустим, я дважды щелкаю точку (X,Y); тогда круг наносится на ((350+X)/2,(525+Y)/2).

РЕДАКТИРОВАТЬ 2: Просто для полноты, вот файл .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>

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

Где вы устанавливаете поле, вы должны вычесть радиус из верхнего и левого свойств, чтобы сместить круг.

1 голос
/ 28 июня 2011

Вам нужно принять ум и высоту в охрану, когда вы устанавливаете поле.сверху должна быть центральная позиция минус половина высоты, и то же самое слева:

new Thickness(
     left: circleCenter.X + (_circle.Width/2), //farther to the right
     top: circleCenter.Y - (_circle.Height/2), //higher up
     right: 0, bottom: 0);
1 голос
/ 28 июня 2011

Вам нужно сместить на половину ширины / высоты круга. Здесь жестко запрограммировано, чтобы было легко следовать:

AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myLabel);
var point = e.GetPosition(myLabel);
point.X -= 5;
point.Y -= 5;
adornerLayer.Add(new ShapeAdorner(myLabel, point));
0 голосов
/ 09 июля 2011

Предыдущие ответы верны.Однако основная проблема заключалась в том, что я пропустил эти две строки:

_circle.HorizontalAlignment = HorizontalAlignment.Left;<br> _circle.VerticalAlignment = VerticalAlignment.Top;

Значение по умолчанию Stretch вызвало огромную ошибку смещения.

...