显示椭圆的半径 - WPF

时间:2013-04-23 15:11:52

标签: c# wpf ellipse pathgeometry

我有一个椭圆几何体。我想用C#从中心到圆的边缘绘制一条线来显示椭圆的半径。我怎样才能做到这一点?

注意:椭圆的中心和半径不固定,由用户定义。

enter image description here

2 个答案:

答案 0 :(得分:5)

假设您有一个已知中心和半径的椭圆:

        Path path = new Path();
        EllipseGeometry eg = new EllipseGeometry();
        eg.Center = new Point(left + side / 2, top + side / 2);
        eg.RadiusX = side / 2;
        eg.RadiusY = side / 2;
        path.Data = eg;
        paths.Add(path);
        canvas1.Children.Add(paths[paths.Count - 1]);
        .
        .
        path = new Path();
        borderColor.Color = Colors.Red;
        path.Stroke = borderColor;
        path.StrokeThickness = 2;
        LineGeometry r = new LineGeometry();
        r.StartPoint = eg.Center;
        r.EndPoint = new Point(eg.Center.X + eg.RadiusX, eg.Center.Y);
        path.Data = r;
        paths.Add(path);
        canvas1.Children.Add(paths[paths.Count - 1]);

enter image description here

答案 1 :(得分:1)

有很多不同的方法可以做到这一点。这是一个,可能会或可能不会满足您的需求。它只是一个用户控件。圆的半径取决于用户控件的大小,并且它将强制控件的大小均匀。定位用户控件取决于您。内线的角度是可绑定的。

用户控制xaml

<UserControl x:Class="TestWPF.CircleTest"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Foreground="Blue" Background="White"
             x:Name="CT" SnapsToDevicePixels="True">
    <Grid>
        <Ellipse Stroke="{Binding Foreground, ElementName=CT}" Fill="{Binding Background, ElementName=CT}" />
        <Line X1="{Binding Center.X, ElementName=CT}" X2="{Binding EndPoint.X, ElementName=CT}" Y1="{Binding Center.Y, ElementName=CT}" Y2="{Binding EndPoint.Y, ElementName=CT}" 
              Stroke="{Binding Foreground, ElementName=CT}">
            <Line.RenderTransform>
                <RotateTransform Angle="{Binding Angle, ElementName=CT}" CenterX="{Binding Center.X, ElementName=CT}" CenterY="{Binding Center.Y, ElementName=CT}" /> 
            </Line.RenderTransform>  
        </Line>
        <TextBlock Text="{Binding Angle, ElementName=CT, StringFormat='N2'}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="3" />
    </Grid>
</UserControl>

背后的用户控制代码

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace TestWPF
{
    public partial class CircleTest : UserControl, INotifyPropertyChanged
    {
        public CircleTest()
        {
            InitializeComponent();

            this.SizeChanged += CircleTest_SizeChanged;
        }

        void CircleTest_SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
        {
            double radius;
            if (ActualHeight < ActualWidth)
            {
                Width = ActualHeight;
                _center = new Point(Width / 2, ActualHeight / 2);
                radius = ActualHeight / 2;
            }
            else
            {
                Height = ActualWidth;
                _center = new Point(ActualWidth / 2, Height / 2);
                radius = ActualWidth / 2;
            }

            _endPoint = new Point(Center.X, Center.Y - radius);

            NotifyOfPropertyChange("Center");
            NotifyOfPropertyChange("EndPoint");
        }

        public double Angle
        {
            get { return (double)GetValue(AngleProperty); }
            set { SetValue(AngleProperty, value); }
        }
        public static readonly DependencyProperty AngleProperty = DependencyProperty.Register("Angle", typeof(double), typeof(CircleTest), new PropertyMetadata(45.0));

        private Point _center;
        public Point Center
        {
            get { return _center; }
        }

        private Point _endPoint;
        public Point EndPoint
        {
            get { return _endPoint; }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyOfPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

您可以这样使用它:

<Window x:Class="TestWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:test="clr-namespace:TestWPF"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <test:CircleTest Width="200" Height="200" Foreground="Purple" Angle="{Binding Value, ElementName=SL}" />
        <Slider x:Name="SL" Minimum="0" Maximum="360" VerticalAlignment="Bottom" Margin="20" />
    </Grid>
</Window>