I'm creating a control where it can draw an angle. I have three dependency objects.
- Radius: Lenght of the line
- StartAngle: From what degree should I start
- Angle
Here's a screenshot about the program currently draws (the red line is what I'm trying to draw).
So what I haven't accomplished yet is the arc. I need some help to draw it. Here's what I have.
public class AngleControl2 : Control
{
static AngleControl2()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(AngleControl2), new FrameworkPropertyMetadata(typeof(AngleControl2)));
}
public double Angle
{
get { return (double)base.GetValue(AngleProperty); }
set { base.SetValue(AngleProperty, value); }
}
public static readonly DependencyProperty AngleProperty =
DependencyProperty.Register("Angle", typeof(double), typeof(AngleControl2), new PropertyMetadata(90.0, new PropertyChangedCallback(AngleChanged)));
public double StartAngle
{
get { return (double)base.GetValue(StartAngleProperty); }
set { base.SetValue(StartAngleProperty, value); }
}
public static readonly DependencyProperty StartAngleProperty =
DependencyProperty.Register("StartAngle", typeof(double), typeof(AngleControl2), new PropertyMetadata(0.0, new PropertyChangedCallback(AngleChanged)));
public double Radius
{
get { return (double)base.GetValue(RadiusProperty); }
set { base.SetValue(RadiusProperty, value); }
}
public static readonly DependencyProperty RadiusProperty =
DependencyProperty.Register("Radius", typeof(double), typeof(AngleControl2), new PropertyMetadata(100.0));
static void AngleChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
AngleControl2 c = (AngleControl2)property;
Line line1 = c.GetTemplateChild("PART_Line1") as Line;
Line line2 = c.GetTemplateChild("PART_Line2") as Line;
if (line1 != null)
{
line1.X2 = Math.Cos((c.StartAngle + c.Angle) * (Math.PI / 180)) * c.Radius;
line1.Y2 = Math.Sin((c.StartAngle + c.Angle) * (Math.PI / 180)) * c.Radius;
}
if (line2 != null)
{
line2.X2 = Math.Cos(c.StartAngle * (Math.PI / 180)) * c.Radius;
line2.Y2 = Math.Sin(c.StartAngle * (Math.PI / 180)) * c.Radius;
}
}
}
There's an
ArcSegment
class which can do that, read the docs.It will be easier to use Path instead of Line. For example, if you have following piece your template
Then you can use this code in your AngleChanged event:
Note, it's also a better idea to call your AngleChanged handler in OnApplyTemplate() like this so that the visual will show up at startup.