Ограничивающая рамка, обрезка краев на произвольном эллипсе

У меня есть собственный код эллипса, показанный ниже. Я рисую резиновую ленту, используя эллипс, устанавливая ширину и высоту, используя две точки, код показан ниже. Однако, когда я рисую эллипс, ограничивающая рамка обрезает края по бокам. Я решил эту проблему раньше, используя фактическую высоту и ширину, но это было в отдельном приложении. Когда я интегрировал его с частью рисования резинкой, фактическая высота и ширина больше не работают, по какой-то причине они не обновляются, когда я устанавливаю ширину и высоту. Вы знаете, как это исправить, чтобы края не обрезались.

 namespace WpfApplication4
{
    class Ellipse2 : Shape
    {
        EllipseGeometry ellipse;
        public static readonly DependencyProperty TextBoxShapeProperty = DependencyProperty.Register("TextBoxShape", typeof(TextBoxShape), typeof(Ellipse2), new FrameworkPropertyMetadata(null));
        public TextBoxShape TextBoxShape
        {
            get { return (TextBoxShape)GetValue(TextBoxShapeProperty); }
            set { SetValue(TextBoxShapeProperty, value); }
        }
        public Ellipse2()
        {
            ellipse = new EllipseGeometry();

            this.Fill = Brushes.Transparent;
            this.Stroke = Brushes.Gray;
            this.StrokeThickness = 3;

        }
        protected override Geometry DefiningGeometry
        {
            get
            {
                TranslateTransform t = new TranslateTransform(Width / 2, Height / 2);
                ellipse.Transform = t;
                ellipse.RadiusX = this.Width / 2;
                ellipse.RadiusY = this.Height / 2;

                return ellipse;
            }
        }
    }
}

     double width = Math.Abs(initMousePoint.X - currMousePoint.X);
     double height = Math.Abs(initMousePoint.Y - currMousePoint.Y);
     double left = Math.Min(initMousePoint.X, currMousePoint.X);
     double top = Math.Min(initMousePoint.Y, currMousePoint.Y);
     rubberBandShape.Width = width;
     rubberBandShape.Height = height;
     Canvas.SetTop(rubberBandShape, top);
     Canvas.SetLeft(rubberBandShape, left);

person mihajlv    schedule 31.08.2011    source источник
comment
Пожалуйста, прекратите добавлять теги в заголовки вопросов, это необязательно и к заголовку страницы автоматически добавляется самый популярный тег.   -  person H.B.    schedule 31.08.2011
comment
Единственная проблема в том, что Ellipse2 обрезаны края? Я попробовал, и, похоже, он не справляется с такими вещами, как Margin и т. Д. В любом случае, попробуйте компенсировать StrokeThickness, например ellipse.RadiusX = (this.Width / 2) - StrokeThickness / 2;   -  person Fredrik Hedblad    schedule 31.08.2011
comment
@Meleak, спасибо, все сработало отлично, не знаю, как я об этом не подумал. Опубликуйте это как ответ, если хотите, и я приму его. Кстати, знаете ли вы, почему фактическая высота и ширина не обновляются?   -  person mihajlv    schedule 31.08.2011
comment
@mihajlv: Хорошо, добавил ответ :) Я тоже пробовал с ActualWidth и ActualHeight, и у меня это сработало лучше, чем Width и Height. Не уверен, почему у вас возникла эта проблема   -  person Fredrik Hedblad    schedule 31.08.2011


Ответы (1)


Попробуйте компенсировать StrokeThickness, например

ellipse.RadiusX = (this.Width / 2) - StrokeThickness / 2;
ellipse.RadiusY = (this.Height / 2) - StrokeThickness / 2;
person Fredrik Hedblad    schedule 31.08.2011