2010-07-23 2 views
0

У меня есть класс LineG, унаследованный от формы, которая будет рисовать простую линию между двумя точками. Я сделал это просто добавив два свойства зависимостей StartPointProperty и EndPointProperty ... Наконец, я хочу добавить еще один функциональность, которая является MidPoint, поэтому, когда я рисую линию, в середине линии будет средний пункт. Когда я перетащить StartPoint или EndPoint форма будет перерисовывать, и когда я перетащить MidPoint форму переведут в зависимости от изменения MidPoint ...Как избежать рекурсивных зависимых свойств

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

Что вы хотите сказать? И я не вижу, как название связано с текстом вопроса ... –

+0

Мне очень жаль, у меня была настоящая головная боль ... Мой вопрос в том, когда я меняю StartPoint или EndPoint, он изменит MidPoint с ним ... и когда я меняю MidPoint, он должен изменить как StartPoint, так и EndPoint, но это приведет к рекурсивной ситуации ... при изменении StartPoint, MidPoint изменится, а MidPoint с другой стороны изменится StartPoint и т. д. ... как решить эту проблему ... –

ответ

1

В таких случаях можно добавить Int счетчик для каждого в вашем классе, который вы увеличиваете во время обработки. Вы не делаете что-либо, если счетчик не равен 0. Пример:

 
private int _suspendCalculation; 

private static void OnPropertyChanged(..) 
{ 
    if (_suspendCalculation > 0) return; 
    _suspendCalculation++; 
    try 
    { 
     CalculateAndSetOtherProperty(); 
    } 
    finally 
    { 
     _suspendCalculation--; 
    } 
} 
Смежные вопросы