【问题标题】:how to have arrow symbol on a line in C#/WPF?如何在 C#/WPF 中的一行上有箭头符号?
【发布时间】:2012-10-25 03:10:20
【问题描述】:

我是 C#/WPF 应用程序中的图形新手。

我有一个 WPF 应用程序并使用 Canvas 在运行时借助鼠标绘制各种对象。我在用箭头画线时遇到问题(如下所示):

(A) ------------>---- (B)

在此箭头符号应位于行的第 3 部分(并且应始终指向移动的鼠标)。例如,如果我在“A”点单击鼠标并向“B”点移动,则箭头符号应指向“B”,如上所示。

我们将不胜感激。

最好的问候, 月亮

【问题讨论】:

    标签: wpf


    【解决方案1】:

    感谢您的所有帮助和支持。我已经解决了我的问题如下::

    private static Shape DrawLinkArrow(Point p1, Point p2)
    {
        GeometryGroup lineGroup = new GeometryGroup();
        double theta = Math.Atan2((p2.Y - p1.Y), (p2.X - p1.X)) * 180 / Math.PI;
    
        PathGeometry pathGeometry = new PathGeometry();
        PathFigure pathFigure = new PathFigure();
        Point p = new Point(p1.X + ((p2.X - p1.X) / 1.35), p1.Y + ((p2.Y - p1.Y) / 1.35));
        pathFigure.StartPoint = p;
    
        Point lpoint = new Point(p.X + 6, p.Y + 15);
        Point rpoint = new Point(p.X - 6, p.Y + 15);
        LineSegment seg1 = new LineSegment();
        seg1.Point = lpoint;
        pathFigure.Segments.Add(seg1);
    
        LineSegment seg2 = new LineSegment();
        seg2.Point = rpoint;
        pathFigure.Segments.Add(seg2);
    
        LineSegment seg3 = new LineSegment();
        seg3.Point = p;
        pathFigure.Segments.Add(seg3);
    
        pathGeometry.Figures.Add(pathFigure);
        RotateTransform transform = new RotateTransform();
        transform.Angle = theta + 90;
        transform.CenterX = p.X;
        transform.CenterY = p.Y;
        pathGeometry.Transform = transform;
        lineGroup.Children.Add(pathGeometry);
    
        LineGeometry connectorGeometry = new LineGeometry();
        connectorGeometry.StartPoint = p1;
        connectorGeometry.EndPoint = p2;
        lineGroup.Children.Add(connectorGeometry);
        System.Windows.Shapes.Path path = new System.Windows.Shapes.Path();
        path.Data = lineGroup;
        path.StrokeThickness = 2;
        path.Stroke = path.Fill = Brushes.Black;
    
        return path;
    }
    

    谢谢,

    月亮

    【讨论】:

    • 这个答案对我有帮助!对于任何想在行尾有箭头的人,将 1.35 更改为 1。谢谢@Moon
    • @Moon,谢谢!一直在寻找,这是易于理解且即插即用的解决方案
    • 知道如何让箭头稍微弯曲(弧形)吗?
    【解决方案2】:

    我刚刚用 Expression Blend 4 的箭头形状绘制了两个,它们创建了这个:

         <Window
            ...
            xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" ... /> 
    
        <ed:BlockArrow Height="8" Margin="119,181,169,0" Orientation="Left" Stroke="Black" VerticalAlignment="Top" />
        <ed:LineArrow Fill="#FFF4F4F5" Height="1" Margin="119,117,169,0" Stroke="#FF027602" VerticalAlignment="Top" BendAmount="0" StartCorner="TopRight" StrokeThickness="2"/>
    

    【讨论】:

    • 您需要为您的反对票提供解释。这可能并不总是最合适的解决方案,但它是一个有效的选项,除非您可以证明其他方式。
    【解决方案3】:

    可以使用Canvas控件来表示箭头,

    <Canvas Margin="5" Width="60" Height="20">            
        <Line X1="10" Y1="10" X2="50" Y2="10" Stroke="Black" 
                      StrokeThickness="2" StrokeDashCap="Round" StrokeEndLineCap="Round" StrokeStartLineCap="Round"/>
        <Line X1="35" Y1="10" X2="30" Y2="5" Stroke="Black" 
                      StrokeThickness="2" StrokeDashCap="Round" StrokeEndLineCap="Round" StrokeStartLineCap="Round"/>
        <Line X1="35" Y1="10" X2="30" Y2="15" Stroke="Black" 
                      StrokeThickness="2" StrokeDashCap="Round" StrokeEndLineCap="Round" StrokeStartLineCap="Round"/>
    </Canvas>
    

    如果你想在运行时创建它,你可以在类后面的代码中创建Canvas

    请注意,上面的示例实际上并不遵循箭头符号应位于线条的第 3 部分 规则,您可能需要相应地修改线条的坐标。

    【讨论】:

    • 嗨德文德拉,感谢您的回复。形状是正确的,但我想我无法让你清楚我的问题。问题是画布最初应该是空的,当用户单击画布并开始拖动鼠标时,这个箭头图像应该在屏幕上弹出,用户可以在运行时决定图像的长度(意味着当他拖动此图像)。
    • 很久以前,但如果你只想要一个箭头,那么我建议将一些东西绑定到可见性。这将帮助您避免管理另一个对象。
    【解决方案4】:

    我建议你使用路径几何。看看这个样本(也许你已经有了),但它和你的要求相似,http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part4.aspx

    【讨论】:

      【解决方案5】:

      我会使用您想要的箭头图像来做到这一点。制作一个快速的 photoshop .jpg 或 .png 以用于默认箭头图像,然后根据点 A 和 B 之间的距离对其进行缩放。旋转稍微复杂一些,但如果你已经学习了基本的三角课程,它应该还是很容易的。

      另一种方法是绘制像素。这通常要困难得多,在这种情况下确定箭头方向的代码甚至更加困难。再次,我建议上面的方法。

      【讨论】:

      • 感谢您的回复。我不能使用图像选项,因为我必须将此图像序列化为 XML 文件并将其存储为对象。
      【解决方案6】:

      您可以使用Line 类来绘制组成箭头的线段。例如,您可以画一条从 A 到 B 的长线和两条较小的有角度的线来绘制指向 B 的头部。

      找到合适的线位置所涉及的数学应该不会太难。对于头部,只需确定两个部分的大小,然后将它们画在 B 附近,角度为 30 度左右。如果您有任何问题,请告诉我。

      图像技术的问题是头部会随着箭头的长度而伸展。您必须在头部和其余部分之间划分位图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 2017-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多