2015-10-16 1 views
0

Я использую C# WPF для рисования 10 полилиний на сенсорном экране. Тем не менее, он получил ошибкуКак я могу добавить более 1 полилинии в холст?

«Довод expception было необработанное Необработанное исключение типа „System.ArgumentException“произошло в PresentationCore.dll

Дополнительная информация: Указанный Визуальная уже потомком другого Визуальное или корень CompositionTarget. "

для линии

canvas.Children.Add(freeline); в частном пустоте canvas_TouchDown , когда я обратил вторую строчку. Я мог успешно обменял одну линию, но , когда я начал рисовать вторую строчку, он получил указанную ошибку

public partial class MainWindow : Window 
{ 
    //List<Point> list = new List<Point>(); 
    Polyline freeline = new Polyline(); 

    bool isMouseDown = false; //mouse 

    Color[] colours = new Color[10] {Colors.White, Colors.Yellow, 
     Colors.Green,Colors.LightBlue, Colors.LightGreen, 
     Colors.LightCyan, Colors.LightGray, Colors.LightPink, 
     Colors.Purple, Colors.Red}; 
    // Store the active lines, each of which corresponds to a place 
    // the user is currently touching down. 
    Dictionary<int, Line> movingLines = new Dictionary<int, Line>(); 
    Line line = new Line(); 
    int counter = 0; 



    public MainWindow() 
    { 


     InitializeComponent(); 


    } 
    private void canvas_TouchDown(object sender, TouchEventArgs e) 
    { 
     counter = (counter + 1) % 10; 
     Line line = new Line(); 
     // line.StrokeThickness = e.GetTouchPoint().Size; 
     // line.Stroke = new SolidColorBrush(colours[counter]); 

     // Position the line at the touch-down point. 
     TouchPoint touchPoint = e.GetTouchPoint(canvas); 
     line.X1 = touchPoint.Position.X; 
     line.Y1 = touchPoint.Position.Y; 
     line.X2 = line.X1; 
     line.Y2 = line.Y1; 
     movingLines[e.TouchDevice.Id] = line; 
     // Add the line to the Canvas. 
     //canvas.Children.Add(line); 
     // list_store_point_touch(touchPoint.Position.X, touchPoint.Position.Y); 

      canvas.Children.Add(freeline); 
      freeline.StrokeThickness = 4; 
      freeline.Stroke = new SolidColorBrush(colours[counter]); 


     //e.GetTouchPoint() 

     //for (int counter = 0; counter < touchPoint.Position.X ; counter++) 
     //{ 
     // canvas.Children.Add(freeline); 
     // freeline.StrokeThickness = 4; 
     // freeline.Stroke = new SolidColorBrush(colours[counter]); 
     //} 


     /* for (int i = 0; i < handwritings.Points.Count - 1; i++) 
     { 
      drawingContext.DrawLine(new Pen(Brushes.Yellow, 3), 
       handwritings.Points[i], handwritings.Points[i + 1]); 
     } */ 

    } 





    private void canvas_TouchMove(object sender, TouchEventArgs e) 
    { 

     // Get the line that corresponds to the current touch-down. 
     line = movingLines[e.TouchDevice.Id]; 

     // Move it to the new touch-down point. 
     TouchPoint touchPoint = e.GetTouchPoint(canvas); 
     line.X2 = touchPoint.Position.X; 
     line.Y2 = touchPoint.Position.Y; 
     list_store_point_touch(touchPoint.Position.X, touchPoint.Position.Y); 

    } 


    private void canvas_TouchUp(object sender, TouchEventArgs e) 
    { 
     movingLines.Remove(e.TouchDevice.Id); 

    } 

    private void list_store_point_touch(double X, double Y) 
    { 
     Point point = new Point(X,Y);    
     freeline.Points.Add(point); 

    } 


    private void canvas_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     isMouseDown = true; 

     counter = (counter + 1) % 10; 
     line = new Line(); 
     line.StrokeThickness = 4; 


     line.Stroke = new SolidColorBrush(colours[counter]); 

     // Position the line at the mouse down point. 
     Point mousePoint = e.GetPosition(canvas); 
     line.X1 = mousePoint.X; 
     line.Y1 = mousePoint.Y; 
     line.X2 = line.X1; 
     line.Y2 = line.Y1; 
     //Add the line to the Canvas. 


      canvas.Children.Add(freeline); 
      freeline.StrokeThickness = 4; 
      freeline.Stroke = new SolidColorBrush(colours[counter]); 

     //canvas.Children.Add(line); 
    } 
+0

Если один из нижеприведенных ответов решает вашу проблему, пожалуйста, отметьте как ответ. – cleftheris

ответ

0

Не используйте один и тот же экземпляр Polyline.
Удалить строку:

Polyline freeline = new Polyline();

Когда вам нужно сделать еще один Polyline, создать новый и нарисовать его.

0

Ошибка поясняется, что вы добавляете то же самое freeline несколько раз в VisualTree. Вам нужно использовать какой-либо фабричный метод, чтобы всегда получать новые экземпляры Polyline перед добавлением в коллекцию canvas.Children