2010-11-06 44 views
1

所以我有一个颜色选择器。用户可以使用RGB或HSB选择颜色。每个值都有滑块/属性。例如,当用户设置红色时,我将计算HSB值以反映新的颜色值。当用户设置Hue时,RGB值将从HSB值重新计算。但看到那里有一个循环。当我设置RGB时,它必须重新计算HSB值,至此确定,但这也意味着HSB值将会改变,从而导致RGB值被重新更新。我认为这是问题所在,但我该如何解决这个问题?需要帮助防止无限循环。设置属性

UPDATE:一种可能的方案

一个可能的解决方案,我所用的是标志,不是很可读寿,但它的作品。基本上,当我设置的属性,我还设置了标志,以表示我设置的值

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的,解决方案

回答

6

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

+0

我想在通过字段设置属性后添加'NotifyPropertyChanged()'也应该运行 – 2010-11-06 12:22:37

+0

@Jiewmeng所以那样做... – 2010-11-06 12:58:27

0

也许你可以尝试设置一个标志,指定至极的是:第一,改变了两个人,那么首先要在你的功能适用做变化是控制哪一个是第一个被改变的。

0

我会将属性设置为只读,并为每种类型设置一个方法。 SetRGB和SetHSB