2010-07-23 7 views
0

J'ai une classe LineG héritée d'une forme qui dessine une ligne simple entre deux points .. Je l'ai fait simplement en ajoutant deux propriétés de dépendance StartPointProperty et EndPointProperty ... Enfin, je veux ajouter une autre fonctionnalité qui est MidPoint, donc quand je dessine la ligne, il y aura un point milieu au milieu de la ligne. Quand je fais glisser la StartPoint ou EndPoint la forme seront redessinés, et quand je fais glisser la MidPoint la forme traduirai en fonction du changement MidPoint ...Comment éviter les propriétés de dépendance récursives

private static void PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      LineG lineG = (LineG)d; 
      if (e.Property.Name == "StartPoint") 
      { 

      } 
      else if (e.Property.Name == "EndPoint") 
      { 

      } 
      else //if MidPoint 
      { 
       Point p1 = (Point)e.OldValue; 
       Point p2 = (Point)e.NewValue; 
       double offsetX = p2.X - p1.X; 
       double offsetY = p2.Y - p1.Y; 

       lineG.StartPoint = new Point(lineG.StartPoint.X + offsetX, lineG.StartPoint.Y + offsetY); 
       lineG.EndPoint = new Point(lineG.EndPoint.X + offsetX, lineG.EndPoint.Y + offsetY); 
       lineG.MidPoint = GeneralMethods.MidPoint(lineG.StartPoint, lineG.EndPoint); 
      } 

      lineG.InvalidateMeasure(); 
     } 

protected override Geometry DefiningGeometry 
     { 
      get 
      { 
       lg.StartPoint = StartPoint; 
       lg.EndPoint = EndPoint; 
       return lg; 
      } 
     } 
+1

Quelle est votre question? Et je ne vois pas comment le titre est lié au texte de la question ... –

+0

Je suis tellement désolé, j'ai eu un vrai mal de tête ... Ma question est quand je change le StartPoint ou le EndPoint ça va changer le MidPoint avec ça ... et quand je change de MidPoint il doit changer à la fois StartPoint et EndPoint, mais cela entrera dans une situation récursive ... quand je changerai le StartPoint, le MidPoint changera et le MidPoint changera d'autre part le point de départ et ainsi de suite ... comment résoudre ce problème ... –

Répondre

1

Dans ce cas, vous pouvez ajouter un compteur à chaque int opération dans votre classe que vous incrémentez pendant le traitement. Vous ne faites rien si le compteur n'est pas 0. Exemple:

 
private int _suspendCalculation; 

private static void OnPropertyChanged(..) 
{ 
    if (_suspendCalculation > 0) return; 
    _suspendCalculation++; 
    try 
    { 
     CalculateAndSetOtherProperty(); 
    } 
    finally 
    { 
     _suspendCalculation--; 
    } 
} 
Questions connexes