2016-11-21 29 views
0

私はWPFでこのアプリケーションを作成しています。矢じりは、以下に示すようにリソースディクショナリで作成された多角形である:WPFポリゴン回転トランスフォームは移動方向を回転します

<!-- This is the arrowhead of the wire --> 
<Polygon x:Name="PART_arrow" 
    Points="{Binding Path=ArrowPathData}" IsHitTestVisible="True" 
    Stroke="{TemplateBinding Stroke}" StrokeThickness="{TemplateBinding InnerWireStrokeThickness}" 
    Fill="White" RenderTransformOrigin="0,0.5" RenderTransform="{Binding ArrowRotation}"> 
</Polygon> 

私はそれでpointcollectionと矢じりを作成していますのviewmodelでラインの最後の関節の位置に応じた位置です。最後に矢頭は線の角度に従って回転する必要がありますが、これは後で行います。この瞬間、アローヘッドは視覚化され、ラインの最後のジョイントに従います。これは、矢印の回転が0の場合にのみ機能します。回転を変更すると、矢印の動きも変わります。だから私は回転を90度に設定しました。矢頭は90度回転しますが、私が線を左に動かすと、矢頭が上に移動します。 RenderTransform設定ツールをLayoutTransformに変更しようとしました。そして私はPolygon.Rendertransformを使用し、角度をハードコードしました。しかし、何も動作しません。

public PointCollection ArrowPathData 
{ 
    get 
    { 
     PointCollection arrow = new PointCollection(); 

     if(isArrowSelected) 
      arrow = PointCollection.Parse("0,0 3,5 0,0 -3,5"); 
     else if (isWindowSelected) 
      arrow = PointCollection.Parse("0,0 5,10 0,20 -5,10"); 
     else if (isRoofSelected) 
      arrow = PointCollection.Parse("0,0 5,10 -5,10"); 

     IEnumerable<WireJoint> joints = Joints; 
     if (joints.Count<WireJoint>() > 0) 
     { 
      WireJoint lastJoint = joints.Last(); 

      if (lastJoint != null) 
      { 
       for (int i = 0; i < arrow.Count; i++) 
       { 
        arrow[i] = new Point(lastJoint.Point.X + arrow[i].X - Offset.X, lastJoint.Point.Y + arrow[i].Y - Offset.Y); 
       } 
      } 
      return arrow; 
     } 
     else 
      return new PointCollection(); 
    } 
} 

public RotateTransform ArrowRotation 
{ 
    get 
    { 
     return new RotateTransform(45) ; 
    } 
} 

誰かがこの問題を解決するのに役立つことがありますか?

編集:あなたはポリラインの最後の二つの点から変換されたジオメトリを作成し、バインディングコンバーターを使用したい場合があり、コード

答えて

0

に余分な矢印を追加しました:

public class ArrowHeadConverter : IValueConverter 
{ 
    public object Convert(
     object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Geometry geometry = null; 
     var points = value as IList<Point>; 

     if (points != null && points.Count >= 2) 
     { 
      geometry = Geometry.Parse("M0,0 L5,10 -5,10Z").Clone(); 

      var lastPoint = points[points.Count - 1]; 
      var lastSegment = lastPoint - points[points.Count - 2]; 
      var angle = Vector.AngleBetween(new Vector(0, -1), lastSegment); 
      var transform = Matrix.Identity; 

      transform.Rotate(angle); 
      transform.Translate(lastPoint.X, lastPoint.Y); 

      geometry.Transform = new MatrixTransform(transform); 
     } 

     return geometry; 
    } 

    public object ConvertBack(
     object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

あなたがコンバータを使用することができますこの単純な例のように:

<Canvas> 
    <Canvas.Resources> 
     <local:ArrowHeadConverter x:Key="ArrowHeadConverter"/> 
    </Canvas.Resources> 

    <Polyline x:Name="polyline" Stroke="Black" StrokeThickness="2" 
       Points="10,10 50,20 70,40 80,60"/> 

    <Path Fill="White" Stroke="Black" StrokeThickness="2" 
      Data="{Binding Points, ElementName=polyline, 
         Converter={StaticResource ArrowHeadConverter}}"/> 
</Canvas> 
+0

私のコードを編集しました。私は表示するために異なる矢頭があることを忘れてしまったので、固定小数点のサイズはありません。 – Basseytje

+0

矢印の始点を定義するプロパティをコンバーターに追加することができます。 – Clemens

+0

プロパティをコンバーターに追加するにはどうすればよいですか? – Basseytje

関連する問題