2014-09-06 2 views
1
void MainWindow_MouseMove(object sender, MouseEventArgs e) 
{ 
    Ellipse el = new Ellipse(); 

    el.Fill = ellipse.Fill; 
    el.Width = ellipse.Width; 
    el.Height = ellipse.Height; 

    Point p = e.GetPosition(this.canvasPrint); 
    Canvas.SetLeft(el, p.X); 
    Canvas.SetTop(el, p.Y); 
    canvasPrint.Children.Add(el); 
} 

이것은 내가 작성한 프로그램의 샘플 코드입니다. 나는 캔버스에 타원을 추가하고 있습니다. 각 타원의 점은 마우스 커서의 점입니다. 마우스가 움직일 때 MS 페인트의 브러쉬 도구처럼 작동하도록 새 타원이 생성되고 추가됩니다.WPF에서 캔버스에 많은 자식을 추가 할 때 메모리를 절약 할 수 있습니까?

그러나 너무 많은 메모리를 소비합니다. 잠시 후 프로그램이 느려집니다. 이 문제를 해결할 방법이 있습니까? 캔버스에 추가 할 때 동일한 타원 객체를 재사용 할 수 없습니까?

+0

컨트롤로 "페인트"하지 마십시오. 컨트롤은 제거 될 때까지 제거되고 더 이상 필요하지 않습니다. 같은 타원 객체를 다시 사용하면 단순히 새 위치로 * 이동 *됩니다. – user2864740

+0

감사합니다. 그렇다면 내가 그림을 그릴 때 무엇을 사용해야합니까? InkCanvas에 대해 조사했습니다 ... 올바른 접근입니까 ?? – user3649944

+0

목표가 "강조 표시/추적"하는 것일 경우 간단히 적은 수의 개체를 만듭니다. 백만 번 타원을 추가하는 대신 마우스에 상당한 각도/시간 변경이있을 때마다 팻 경로 획을 추가하십시오. 이것은 추가 된 요소의 속도를 늦추어 모든 감속도 (결국에는 * 될 것임)가 중요하지 않거나 눈에 띄지 않도록해야합니다. – user2864740

답변

3

브러시 경로를 그리려면 DrawingVisualDrawingContext을 사용해야합니다. DrawingContext은 Windows Forms Graphics 개체와 유사합니다. 따라서 상황에 따라 브러쉬 경로를 동일한 DrawingContext에 그립니다.

+0

이것은. DrawingVisual은 매우 가볍고 이런 종류의 작업을 위해 설계되었습니다. – Kelly

관련 문제