Там же много различных способов сделать это. Вот один, который может или не может удовлетворить ваши потребности. Это просто пользовательский контроль. Радиус круга зависит от размера пользовательского элемента управления, и он заставит элемент управления быть однородным по размеру. Позиционирование пользовательского элемента управления будет зависеть от вас. Угол внутренней линии связывается.
управления пользователя 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>
ли вы пытались _anything_ до сих пор? Покажите свои усилия в первую очередь. Прочитайте [FAQ] и [ask] –
вы хотите использовать xaml или в коде? – David
Да, я пробовал, извините, я забыл поместить здесь код. David - код – Sangeetha