所以我有一个颜色选择器。用户可以使用RGB或HSB选择颜色。每个值都有滑块/属性。例如,当用户设置红色时,我将计算HSB值以反映新的颜色值。当用户设置Hue时,将从HSB值重新计算RGB值。但是看到那里有一个循环。当我设置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的解决方案
答案 0 :(得分:6)
我会让所有的设置者调用相同的内部代码:
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
,显然 - 再次设置所有字段(不会调用任何属性设置器)。
答案 1 :(得分:0)
也许你可以尝试设置一个标志来指定哪个是两个中的第一个发生变化,那么在你应用变化的函数中要做的第一件事是控制哪一个是第一个被改变的。
答案 2 :(得分:0)
我希望这些属性是只读的,并且每个类型都有一个方法。 SetRGB和SetHSB