0

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

任务:当鼠标左键被按下时,在光标后的画布上画一条彩色的轨迹线(就像画笔中的画笔一样)。

问题:我认为使用 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;
    }
}
}

xml:

<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

4

1 回答 1

0

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

于 2013-08-28T21:34:41.383 回答