제목에 대한 조사를 한 후에 아무 것도 찾지 못했기 때문에 동일한 질문에 이미 동의 한 경우 미안합니다.System.Windows.Shapes.Path 잘못된 동작
작업 : 마우스 왼쪽 버튼을 누르면 (페인트의 브러시와 같이) 커서가 놓인 후 Canvas에 채색 된 트랙 선을 만듭니다.
문제점 : System.Windows.Shapes.Path를 사용하는 것이이 작업을 수행하는 최선의 방법이라고 생각합니다. 아래 코드는 한 가지를 제외하고는 잘 작동합니다. 커서를 움직여 반대 방향으로 방향을 변경하면 (예 : X 축의 값이 증가한 다음 감소하지만 Y 축의 값이 일정하게 유지됨) 이전 방향에 해당하는 Line의 예기치 않은 부분을 가져옵니다.
내 문제에 대해 얽힌 설명에 대해 사과합니다.
귀하의 컴퓨터에서 쉽게 재현 할 수 있도록 솔루션을 추가하고 있습니다.
제가 실수를 저질렀다는 것을 지적하십시오!
C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using 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
XAML은 어디에 있습니까? 나는'LolCanvas'라는 이름의'Canvas'를 추가 한 후에 코드를 실행하려고 시도했지만 아무 일도 일어나지 않았습니다. – Sheridan
일반 캔버스를 사용하고 있습니까? InkCanvas를 보셨습니까? 그릴 좋은 방법이 될 수 있습니다. 여기 괜찮은 예가 있습니다. http://www.codeproject.com/Articles/617868/Scribble-WPF-InkCanvas-application-Using-PRISM-MVV – bflosabre91
Sheridan, xaml 코드를 추가했습니다. 죄송합니다. bflosabre91, 예 저는 일반 Canvas를 사용하고 있습니다. 링크를 가져 주셔서 감사합니다. 확인해 보겠습니다. – Hellfim