2010-02-14 3 views
0

나는 이것을 위해 예제를 찾았지만, 내가 훑어 본 것들은 너비, 높이, 색상 등과 같은 InkCanvas DefaultDrawingAttributes를 설정하는 것과 같은 간단한 것들에 집중하는 것처럼 보입니다. 많은 재료가있는 것 같지 않습니다. 이.InkCanvas에서 그릴 방법을 어떻게 바꿀 수 있습니까?

예를 들어 마우스 버튼을 누르고 있으면 선을 그어 볼 수 있습니다. 선 대신에 타원을 그리거나 선의 시작과 끝 사이의 표본 지점 주위에 타원을 그 으려면 어떻게해야합니까?

나는 StrokeCollected 이벤트로 새로운 포인트를 얻을 수 있지만, 그 이상으로 나는 어디로 가야할지 모른다. This guy 그가 msdn의 코드를 작동시키는 것처럼 보였지만 그렇게 할 수 없었습니다. XAML을 사용하여 인터페이스를 작성하는 방법 만 알고 있으며 샘플도없는 것 같습니다.

편집

생성자에서 초기화 thisIsNotNice라는 StrokeCollection을 클래스 변수를 만들고이 한 :

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) 
{ 
    myInkCanvas.Strokes = thisIsNotNice; 

    foreach (StylusPoint p in e.Stroke.StylusPoints) 
    { 
     StylusPointCollection spc = new StylusPointCollection(); 
     spc.Add(p); 
     Stroke s = new Stroke(spc); 
     s.DrawingAttributes.Height = 3; 
     s.DrawingAttributes.Width = 3; 
     thisIsNotNice.Add(s); 
    } 
    e.Handled = true; 
} 

을하지만 예상대로 작동하지 않습니다. 타원이 그려지지만 마우스로 그린 선은 그대로 있습니다. 또한 어떤 이유에서 처음으로 그것이 타원형을 그 으려면 처음에는 작동하지만 뒤에 타원과 선을 그립니다. 하지만 대신 이렇게하면 :

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) 
{ 
    myInkCanvas.Strokes = new System.Windows.Ink.StrokeCollection(); 
    e.Handled = true; 
} 

줄이 화면에 표시되지 않습니다. 그래서, 나는 왜 그들이 위의 코드에서 지워지지 않고 있는지 이해하지 못합니다.

나는이 할 경우

private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) 
{ 
    foreach (Stroke s in myInkCanvas.Strokes) 
      System.Diagnostics.Trace.WriteLine(s); 
    e.Handled = true; 
} 

나는 또한 캔버스 라인 스트로크가 포함되어 있음을 알 수있다.

스트로크를 컬렉션에 추가 한 후 스트로크를 지우는 것이 이상적이지는 않지만 적어도 원하는대로합니다. 선 색상을 배경과 동일하게 설정할 수는 있지만 타원 만 가져올 수는 없습니다. 나는 그것들을 별도의 콜렉션에도 복사 할 수있다. 그러나 그것은 단지 끔찍한 것이다.

답변

1

inkCanvas에 획이 표시되는 방식을 사용자 정의하려는 것처럼 들립니다. 여기에 고려해야 할 두 가지 사항이 있습니다. 여기에는 두 가지 별도의 사항이 있습니다. 1) 들어 올려지기 전에 펜에서 잉크가 흘러 나가는 모습 (잉크가 항상 빠르도록 다른 스레드에서 실행되는 DynamicRenderer) 이것에 대한 해결책이 이미 만족 스럽네요.

2) 캔버스에 표시되는 마지막 획이 보이는 방식. 이것을 사용자 지정하려면 Stroke를 서브 클래 싱하여 다음을 재정의 할 수 있습니다. protected override void DrawCore (DrawingContext drawingContext, DrawingAttributes drawingAttributes);

strokeCollected를 얻을 때마다 (그리고 여기에 대한 걱정거리는 있지만 거기에 대해서는 걱정할 필요가 있습니다.) 캔버스에서 들어오는 스트로크를 제거하고 사용자 정의 구현으로 바꾸고 입력 데이터에서 스트로크 데이터를 훔칩니다. 하나.

foreach(sp in this.StylusPoints) 
    drawingContext.DrawEllipse(RADIUS, sp.X, sp.Y) 

을 그리고 같은 일반적으로 어느 시점에 (컨텍스트 속성)이 base.DrawCore를 호출하지 것이다 일어날 라인을 얻을 수 없습니다 :

DrawCore의 구현은 (의사)과 같을 것입니다.