Wpf System.Windows.Shapes.Path错误行为

Wpf System.Windows.Shapes.Path错误行为,wpf,path,extending,Wpf,Path,Extending,在对这个问题做了一些研究之后,我什么也没发现,所以如果已经有人问了同样的问题,我很抱歉 任务:按下鼠标左键(如画笔中的画笔),在光标后在画布上绘制一条彩色轨迹线 问题:我认为使用System.Windows.Shapes.Path是完成此任务的最佳方法。下面的代码可以正常工作,但有一点除外:如果您尝试移动光标,然后将方向更改为相反方向(例如,X轴上的值增加,然后减少,但Y轴上的值保持不变),您将得到与上一个方向相对应的线的意外部分 我很抱歉把我的问题描述得很复杂,但我希望你能理解 为了让你更容易

在对这个问题做了一些研究之后,我什么也没发现,所以如果已经有人问了同样的问题,我很抱歉

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

问题:我认为使用System.Windows.Shapes.Path是完成此任务的最佳方法。下面的代码可以正常工作,但有一点除外:如果您尝试移动光标,然后将方向更改为相反方向(例如,X轴上的值增加,然后减少,但Y轴上的值保持不变),您将得到与上一个方向相对应的线的意外部分

我很抱歉把我的问题描述得很复杂,但我希望你能理解

为了让你更容易在你的机器上复制它,我添加了解决方案

如果我犯了错误,请指出我的错误

C# 使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用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;
    }
}
}
命名空间WpfApplication3
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
私有布尔插入;
专用路径;
私有布尔是第一点;
公共主窗口()
{
初始化组件();
LolCanvas.ishitsetvisible=true;
}
私有void Canvas_MouseMove(对象发送方,MouseEventArgs e)
{
如果(插入)
{
点p=鼠标.GetPosition(LolCanvas);
如果(isFirstPoint)
{
PathFigure myPathFigure=新的PathFigure();
myPathFigure.StartPoint=新点(p.X+5,p.Y+5);
myPathFigure.Segments=新的PathSegmentCollection();
(path.Data作为PathGeometry).Figures.Add(myPathFigure);
isFirstPoint=false;
}
其他的
{
线段myLineSegment=新线段();
myLineSegment.Point=新点(p.X+5,p.Y+5);
(path.Data作为PathGeometry)。图[0]。Segments.Add(myLineSegment);
}
}
}
私有void Canvas_MouseDown(对象发送器,MouseButtonEventArgs e)
{
插入=真;
路径=新路径();
path.Stroke=新的SolidColorBrush(Colors.Red);
path.StrokeThickness=50;
path.Data=新的PathGeometry();
(path.Data作为PathGeometry).Figures=新的PathFigureCollection();
LolCanvas.Children.Add(路径);
isFirstPoint=true;
}
私有void Canvas_MouseUp(对象发送器,MouseButtonEventArgs e)
{
插入=假;
}
}
}
Xaml:



链接到应用程序:

显然,这种行为对于路径是正确的。出现问题的原因是线部件之间的角度。它是180度,所以窗口无法在此处正确地渲染路径。 我有两种方法可以打败它: 1) 将每条线段的IsSmoothJoin属性设置为true。
2) 当这种问题可能发生时,创建另一个Path对象

XAML在哪里?在添加名为
lolvanvas
Canvas
后,我试图运行您的代码,但什么也没发生。您使用的是常规画布吗?你看过画布了吗?如果你想画画,那可能是个不错的选择。这里有一个很好的示例Sheridan,我添加了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>