2010-07-23 115 views
0

我有一个类LineG继承了一个形状,将在两点之间绘制一条简单的线..我通过添加两个依赖项属性StartPointProperty和EndPointProperty来做到这一点......最后我想添加另一个功能是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

你的问题是?我不明白标题与问题的文本是如何相关的... – 2010-07-23 21:10:33

+0

我很抱歉,我真的很头痛...... 我的问题是当我改变StartPoint或EndPoint时,它会改变MidPoint ...并且当我改变MidPoint时,它必须改变StartPoint和EndPoint,但是这会进入递归状态......当我改变StartPoint时,MidPoint将改变,而另一方面MidPoint将改变StartPoint等...如何解决这个问题... – 2010-07-24 11:01:37

回答

1

在这种情况下,您可以添加一个int计数器每在你的班级中操作,你在处理过程中增加。例如:

 
private int _suspendCalculation; 

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