Нужна помощь в предотвращении бесконечного цикла. Настройка свойств - PullRequest
1 голос
/ 06 ноября 2010

Итак, у меня есть палитра цветов. Пользователи могут выбирать цвета, используя RGB или HSB. Есть ползунки / свойства для каждого значения. Например, когда пользователь установит красный, я вычислю значения HSB, чтобы отразить новое значение цвета. Когда пользователь устанавливает Hue, значение RGB будет пересчитано из значений HSB. Но видите, там есть петля. Когда я устанавливаю RGB, он должен пересчитать значения HSB, хорошо, пока, но это также означает, что значения HSB изменятся, и значения RGB будут снова обновлены. Я думаю, что это проблема, но как я могу это исправить?

ОБНОВЛЕНИЕ: одно из возможных решений

Одним из возможных решений, которое я использовал, был флаг, не очень читаемый, но он работает. В основном, когда я устанавливаю свойства, я также устанавливаю флаг, чтобы указать, что я устанавливаю значение

public float Hue {
    get { return _hue; }
    set
    {
        if (_hue == value)
            return;
        CurrentlySetting = (CurrentlySetting.HasValue) ? CurrentlySetting : ColorType.HSB;
        _hue = value;
        NotifyPropertyChanged("Hue");
        NotifyPropertyChanged("Color");
        RecalculateRGB();
        CurrentlySetting = (CurrentlySetting == ColorType.HSB) ? null : CurrentlySetting;
    }
}

Когда я «пересчитываю» значения, я проверяю это и проверяю, не устанавливаю ли я их в настоящее время

protected void RecalculateRGB(Color color = new Color())
{
    if (CurrentlySetting == ColorType.RGB) // prevent stackoverflow
        return;

    if (color == new Color())
        color = HSBColorHelper.FromAHSB(255, Hue, Saturation, Brightness);
    Red = color.R;
    Green = color.G;
    Blue = color.B;
}

Не очень прямолинейно, я все еще предпочитаю @Marc Gravell's, решение

Ответы [ 3 ]

6 голосов
/ 06 ноября 2010

Я хотел бы, чтобы все установщики вызывали один и тот же внутренний код:

public byte R {
    get {return r;}
    set { SetRGB(value, G, B); }
}
public byte G {
    get {return g;}
    set { SetRGB(R, value, B); }
}

и т. Д., И этот внутренний метод SetRGB взаимодействует только с полями (не со свойствами), включая любые поля HSB, которые вынеобходимость;так что нет рекурсии.Вы также можете захотеть SetHSB, очевидно - опять же, установив все поля (не вызывая ни один из установщиков свойств).

0 голосов
/ 06 ноября 2010

Я хотел бы иметь свойства только для чтения и иметь метод для каждого из типов.SetRGB и SetHSB

0 голосов
/ 06 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...