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.
}
}
}