C# 需要帮助防止无限循环。属性设置
所以我有一个颜色选择器。用户可以使用RGB或HSB选择颜色。每个值都有滑块/属性。例如,当用户设置红色时,我将计算HSB值以反映新的颜色值。当用户设置色调时,将根据HSB值重新计算RGB值。但是你看,那里有一个循环。当我设置RGB时,它必须重新计算HSB值,到目前为止还可以,但这也意味着HSB值将发生变化,导致RGB值再次更新。我想这就是问题所在,但我如何才能解决这个问题 更新:一个可能的解决方案 我使用的一个可能的解决方案是flag,虽然不太可读,但它可以工作。基本上,当我设置属性时,我还设置了一个标志,表示我正在设置一个值C# 需要帮助防止无限循环。属性设置,c#,wpf,colors,C#,Wpf,Colors,所以我有一个颜色选择器。用户可以使用RGB或HSB选择颜色。每个值都有滑块/属性。例如,当用户设置红色时,我将计算HSB值以反映新的颜色值。当用户设置色调时,将根据HSB值重新计算RGB值。但是你看,那里有一个循环。当我设置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的解决方案也许你可以尝试设置一个标志来指定wich是两个改变中的第一个,然后,在应用更改的函数中要做的第一件事是控制哪一个是第一个要更改的。也许您可以尝试设置一个标志来指定哪一个是两个更改中的第一个,然后,在应用更改的函数中要做的第一件事是控制第一个更改的是哪个。我将让所有setter调用相同的内部代码:
public byte R {
get {return r;}
set { SetRGB(value, G, B); }
}
public byte G {
get {return g;}
set { SetRGB(R, value, B); }
}
etc-内部的
SetRGB
方法只与字段(而不是属性)对话,包括您需要的任何HSB字段;所以没有递归。显然,您可能还需要一个SetHSB
,再次设置所有字段(不调用任何属性setter)。我会让所有setter调用相同的内部代码:
public byte R {
get {return r;}
set { SetRGB(value, G, B); }
}
public byte G {
get {return g;}
set { SetRGB(R, value, B); }
}
etc-内部的
SetRGB
方法只与字段(而不是属性)对话,包括您需要的任何HSB字段;所以没有递归。显然,您可能还需要一个SetHSB
,再次设置所有字段(不调用任何属性设置器)。我希望属性是只读的,并且每个类型都有一个方法。SetRGB和SetHSB我希望属性是只读的,并且每个类型都有一个方法。SetRGB和SetHSB我想在通过字段设置属性后添加,NotifyPropertyChanged()
应该运行,我想在通过字段设置属性后添加,NotifyPropertyChanged()
也应该运行