gpt4 book ai didi

c# - 需要帮助防止无限循环。属性设置

转载 作者:太空宇宙 更新时间:2023-11-03 19:32:37 24 4
gpt4 key购买 nike

所以我有一个颜色选择器。用户可以使用 RGB 或 HSB 选择颜色。每个值都有 slider /属性。例如,当用户设置红色时,我将计算 HSB 值以反射(reflect)新的颜色值。当用户设置 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 的解决方案

最佳答案

我会让所有的 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 )。

关于c# - 需要帮助防止无限循环。属性设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4112623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com