System.Windows.Shapes.Path不正确的行为

时间:2013-08-15 15:22:13

标签: wpf path extending

在对主题进行一些研究后,我没有找到任何东西,所以如果已经提出同样的问题,我很抱歉。

任务:当按下鼠标左键(如画笔中的画笔)时,在光标后的画布上制作彩色轨迹线。

问题:我认为使用System.Windows.Shapes.Path是执行此任务的最佳方法。下面的代码工作正常,除了一件事:如果你试图移动光标然后改变方向相反(例如,X轴上的值增加,然后减小,但Y轴上的值保持不变),你将得到Line的意外部分,对应于前一个方向。

我很抱歉纠结于我的问题,但我希望你能得到它。

为了让您更容易在机器上重现它,我正在添加解决方案。

如果我做错了,请指出我的错误!

C#     使用系统;     使用System.Collections.Generic;     使用System.Linq;     使用System.Text;     使用System.Threading.Tasks;     使用System.Windows;     使用System.Windows.Controls;     使用System.Windows.Data;     使用System.Windows.Documents;     使用System.Windows.Input;     使用System.Windows.Media;     使用System.Windows.Media.Imaging;     使用System.Windows.Navigation;     使用System.Windows.Shapes;

namespace WpfApplication3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    private Boolean Inserting;
    private Path path;
    private Boolean isFirstPoint;

    public MainWindow()
    {
        InitializeComponent();
        LolCanvas.IsHitTestVisible = true;
    }

    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        if (Inserting)
        {
            Point p = Mouse.GetPosition(LolCanvas);
            if (isFirstPoint)
            {
                PathFigure myPathFigure = new PathFigure();
                myPathFigure.StartPoint = new Point(p.X + 5, p.Y + 5);
                myPathFigure.Segments = new PathSegmentCollection();
                (path.Data as PathGeometry).Figures.Add(myPathFigure);
                isFirstPoint = false;
            }
            else
            {
                LineSegment myLineSegment = new LineSegment();
                myLineSegment.Point = new Point(p.X + 5, p.Y + 5);
                (path.Data as PathGeometry).Figures[0].Segments.Add(myLineSegment);
            }
        }
    }

    private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Inserting = true;
        path = new Path();
        path.Stroke = new SolidColorBrush(Colors.Red);
        path.StrokeThickness = 50;
        path.Data = new PathGeometry();
        (path.Data as PathGeometry).Figures = new PathFigureCollection();
        LolCanvas.Children.Add(path);
        isFirstPoint = true;
    }

    private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Inserting = false;
    }
}
}

的Xaml:

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Canvas x:Name="LolCanvas" MouseMove="Canvas_MouseMove" MouseDown="Canvas_MouseDown"   MouseUp="Canvas_MouseUp" Background="Black">
    </Canvas>
</Window>

链接到应用程序:http://ge.tt/99aSgyo/v/0?c

1 个答案:

答案 0 :(得分:0)

显然这种行为对于路径来说是正确的。由于线部分之间的角度出现问题。它是180度,因此窗口无法在这个地方渲染Path。 我有两种方法可以击败它: 1)为每个线段将IsSmoothJoin属性设置为true。 2)当出现这种问题时,制作另一个Path对象