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