Let me show you what I'm trying to accomplish. This is XAML code which represents a angle three point:
<Border Width="200" Height="200" BorderBrush="Black" BorderThickness="1">
<Canvas HorizontalAlignment="Center" VerticalAlignment="Center"
Width="0" Height="0"
RenderTransform="1 0 0 -1 0 0">
<Line X1="0" Y1="0" X2="{Binding CoordinateX}" Y2="{Binding CoordinateY}" Stroke="Black" />
<Line X1="0" Y1="0" X2="100" Y2="0" Stroke="Black" />
</Canvas>
</Border>
And my data context is:
Test a = new Test();
// degrees * (pi/180)
a.Angle = 45 * (Math.PI / 180.0);
this.DataContext = a;
public class Test
{
public Test() { }
public double Angle { get; set; }
public double CoordinateX { get { return Math.Cos(Angle) * 100; } }
public double CoordinateY { get { return Math.Sin(Angle) * 100; } }
}
But right now, I want to implement the last user control to a CUSTOM WPF CONTROL:
public class Angle : Control
{
static Angle()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Angle), new FrameworkPropertyMetadata(typeof(Angle)));
}
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(Angle), new PropertyMetadata(90.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(Angle), new PropertyMetadata(100));
static void AngleChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
// here is the part I do not have idea to get "PART_LINE1" and change the values for X2 and Y2
}
}
Please check the last static void, I'm trying to do something like this:
// var x = Math.Cos(Angle * (Math.PI / 180))
// var y = Math.Sin(...);
// PART_LINE.X2 = x;
// PART_LINE.Y2 = y;
In your event handler, use the GetTemplateChild method to find the appropriate element, somewhat like so:
static void AngleChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
Angle angleControl = (Angle)obj;
Line line = angleControl.GetTemplateChild("PART_LINE") as Line;
if (line!= null)
{
//manipulate the line here
}
}
And make sure that in the ControlTemplate for your Angle control, you give the Line the appropriate name:
<Line x:Name="PART_LINE" Stroke="Black" />
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.