2010-11-06 75 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