Как избежать рекурсивных свойств зависимости - PullRequest
0 голосов
/ 24 июля 2010

У меня есть класс 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 Ответ

1 голос
/ 09 марта 2011

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

private int _suspendCalculation;

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