2013-04-23 115 views
1

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

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

enter image description here

+3

你有没有试过_anything_这么远吗?先显示你的努力..阅读[常见问题]和[问] – 2013-04-23 15:12:41

+0

你想使用XAML或代码? – David 2013-04-23 15:27:04

+0

是的,我试过了,对不起,我忘了把代码放在这里。 David - 在代码中 – Sangeetha 2013-04-24 10:17:13

回答

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

有这样做的许多不同的方式。这里有一个,可能会满足您的需求。这只是一个用户控件。圆的半径取决于用户控件的大小,并且会强制控件大小一致。定位用户控件将由您决定。内线的角度是可绑定的。

用户控制的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>