Witam, mam problem z rysowaniem linii, mianowicie mam metodę która rysuje linie między kontrolkami. Dodatkowo jedną z mechanik jaką dodałem do kontrolki jest to że można zmienić jej pozycję a po jej zmianie linie są usuwane i rysowane na nowo no i tutaj pojawia się problem ponieważ linia rysuje się od jednej kontrolki do drugiej kontrolki (tej która zmieniła pozycję) ale do starej pozycji a nie nowej. Wrzuciłem więc wykonywanie tego w nowy wątek co naprawiło problem do czasu aż nie uruchomiłem programu po za środowiskiem programistycznym tylko w kompilacji release i problem znów zaczął się tylko tam pojawiać bo jak uruchomię przez Visual Studio wszystko działa jak należy.

Kod:

// MainWindow

private void ButtonEditGoal_Click(object sender, RoutedEventArgs e)
{
	editedGoal.posX = Convert.ToInt32(TextBoxGoalX.Value);
	editedGoal.posY = Convert.ToInt32(TextBoxGoalY.Value);
	
	editedGoal.UpdateModel();
}


// Kontrolka Goal

private void UserControl_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
	ContextMenu contextMenu = new ContextMenu();

	MenuItem item1 = new MenuItem();
	item1.Header = "Edytuj";
	item1.Click += delegate { EditGoal(); };
	contextMenu.Items.Add(item1);
}

void EditGoal()
{
	MainWindow.mainWindow.editedGoal = this;
}


public void UpdateModel()
{
	Dispatcher.Invoke(new Action(() =>
	{  
		LabelGoalName.Content = this.goalName;

		this.Margin = new Thickness(108 * Convert.ToInt32(posX), 107 * Convert.ToInt32(posY) + 40 * Convert.ToInt32(posY), 0, 0);

		foreach (Goal goal in MainWindow.mainWindow.GoalList)
		{
			foreach (SpecialLine item in Goal.linesList) item.RemoveLineFromCanvas();
		}

		var goaBitmap = new BitmapImage(new Uri(imageUrl));
		ImageGoal.Source = goaBitmap;

		Thread thread = new Thread(UpdateLines);
		thread.Start();
	}));
}

void UpdateLines()
{
	foreach (Goal goal in MainWindow.mainWindow.GoalList) 
	{
		if (goal.required.Count > 0)
		{
			Goal target = null;

			foreach (string item in goal.required)
			{
				foreach (Goal targetSearch in MainWindow.mainWindow.GoalList)
				{
					if (item == targetSearch.goalName)
					{
						target = targetSearch;

						Dispatcher.Invoke(new Action(() => { 
							SpecialLine specialLine = new SpecialLine(goal, target, "request");
							specialLine.DrawLine(specialLine.goal, specialLine.target, specialLine.lineType);
							linesList.Add(specialLine);            
						}));
											
						break;
					}
				}
			}
		}
	}
}

// Klasa SpecialLine

public void DrawLine(Goal start, Goal target)
{
	Point relativePoint1 = start.TransformToAncestor(Application.Current.MainWindow).Transform(new Point(0, 0));
	Point relativePoint2 = target.TransformToAncestor(Application.Current.MainWindow).Transform(new Point(0, 0));

	// Z góry na dół 
	if (relativePoint1.Y < relativePoint2.Y)
	{
		if (target.posX != start.posX)
		{
			Line line1 = new Line();
			
			line1.Stroke = System.Windows.Media.Brushes.Black;
			line1.Fill = System.Windows.Media.Brushes.Black;


			line1.X1 = relativePoint1.X + 80;
			line1.Y1 = relativePoint1.Y;

			line1.X2 = relativePoint1.X + 80;
			line1.Y2 = relativePoint1.Y + 100;

			line1.StrokeThickness = 2;

			MainWindow.mainWindow.MainCanvas.Children.Add(line1);
			linesList.Add(line1);
               
                        // Tu jeszcze rysowane są 2 linie ale to analogicznie wygląda jak powyżej więc uciąłem tutaj tylko z innych pozycji.

		}
	}
}