2013-08-15 2 views
0

제목에 대한 조사를 한 후에 아무 것도 찾지 못했기 때문에 동일한 질문에 이미 동의 한 경우 미안합니다.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

+0

XAML은 어디에 있습니까? 나는'LolCanvas'라는 이름의'Canvas'를 추가 한 후에 코드를 실행하려고 시도했지만 아무 일도 일어나지 않았습니다. – Sheridan

+0

일반 캔버스를 사용하고 있습니까? InkCanvas를 보셨습니까? 그릴 좋은 방법이 될 수 있습니다. 여기 괜찮은 예가 있습니다. http://www.codeproject.com/Articles/617868/Scribble-WPF-InkCanvas-application-Using-PRISM-MVV – bflosabre91

+0

Sheridan, xaml 코드를 추가했습니다. 죄송합니다. bflosabre91, 예 저는 일반 Canvas를 사용하고 있습니다. 링크를 가져 주셔서 감사합니다. 확인해 보겠습니다. – Hellfim

답변

0

분명히 행동 이런 종류의 경로에 대한 올바른 것입니다. 문제는 선 부품 간의 각도 때문에 나타났습니다. 그것은 180도 였기 때문에 창은 Path를이 장소에서 적절하게 렌더링 할 수 없었습니다. 나는 그것을 물리 칠 수있는 두 가지 방법이있다. 1) 각 라인 세그먼트에 대해 IsSmoothJoin 속성을 true로 설정한다. 2) 이런 종류의 문제가 발생할 때 다른 Path 개체 만들기

관련 문제