所以我有一个颜色选择器。用户可以使用 RGB 或 HSB 选择颜色。每个值都有滑块/属性。例如,当用户设置红色时,我将计算 HSB 值以反映新的颜色值。当用户设置 Hue 时,RGB 值将从 HSB 值重新计算。但请注意那里有一个循环。当我设置 RGB 时,它必须重新计算 HSB 值,到目前为止还可以,但这也意味着 HSB 值将发生变化,导致 RGB 值再次重新更新。我认为这就是问题所在,但我该如何解决这个问题?
更新:一种可能的解决方案
我使用的一种可能的解决方案是 flag,虽然可读性不太好,但它有效。基本上,当我设置属性时,我还设置了一个标志来表示我正在设置一个值
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 的解决方案
我会让所有设置器调用相同的内部代码:
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
,显然 - 再次设置all字段(不调用任何属性设置器)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)