2013-04-23 117 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>