【问题标题】:Need help preventing infinite loop. Setting of Properties需要帮助防止无限循环。属性设置
【发布时间】:2010-11-06 09:49:11
【问题描述】:

所以我有一个颜色选择器。用户可以使用 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 的解决方案

【问题讨论】:

    标签: c# wpf colors


    【解决方案1】:

    我会让所有的 setter 调用相同的内部代码:

    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,显然 - 再次设置所有字段(不调用任何属性设置器)。

    【讨论】:

    • 我想通过字段设置属性后添加,NotifyPropertyChanged()也应该运行
    【解决方案2】:

    也许您可以尝试设置一个标志来指定哪个是更改的两个中的第一个,然后在您应用更改的函数中要做的第一件事就是控制哪个是第一个被更改的。

    【讨论】:

      【解决方案3】:

      我希望属性是只读的,并且每种类型都有一个方法。 SetRGB 和 SetHSB

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        • 1970-01-01
        • 2021-05-14
        相关资源
        最近更新 更多