0

私が達成しようとしていることをお見せしましょう。これは、角度 3 点を表す XAML コードです。

    <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>

そして、私のデータコンテキストは次のとおりです。

        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; } }
}

しかし今は、最後のユーザー コントロールを 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
    }
}

最後の静的なボイドを確認してください。私は次のようなことをしようとしています:

        // var x = Math.Cos(Angle * (Math.PI / 180))
        // var y = Math.Sin(...);

        // PART_LINE.X2 = x;
        // PART_LINE.Y2 = y;
4

1 に答える 1

1

イベントハンドラーで、GetTemplateChildメソッドを使用して、次のように適切な要素を見つけます。

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
        }
}

また、AngleコントロールのControlTemplateで、Lineに適切な名前を付けていることを確認してください。

<Line x:Name="PART_LINE" Stroke="Black" />
于 2012-07-11T19:08:52.293 に答える