2011-05-04 62 views
0

我有一個用戶控件(從ContainerControl派生),我正在使用漸變填充。第一個漸變顏色可能是也可能不是系統顏色,如SystemColors.Highlight。 第二個漸變顏色是從第一個漸變顏色派生的,通過ControlPaint.Light(firstColor)或類似的方法得出。有沒有辦法在設計時響應系統顏色的變化?

我可以在運行時輕鬆處理更改系統顏色,方法是重寫OnSystemColorsChanged,它可以毫無問題地工作。但是,如果在設計時將控件放置在表單上,​​然後系統顏色發生變化,則第二種顏色保持不變,這可能是由於在設計時未調用OnSystemColorsChanged

由於我爲第二個顏色屬性提供了ShouldSerialize-和Reset-方法,因此我可以手動重置第二種顏色,因此,當系統顏色更改時,該屬性的默認值會相應更改。

那麼,有沒有什麼辦法在設計時捕捉系統顏色變化?

編輯:

下面是一個最小化的代碼示例:

public class Test : ContainerControl 
{ 

public Test() 
{ 
    ResetColor1(); 
    ResetColor2(); 
} 

private bool _resetColor2; 


// Color 1 stuff 
private Color _color1 = Color.Empty; 
public System.Drawing.Color Color1 
{ 
    get { return _color1; } 
    set 
    { 
    _resetColor2 = !ShouldSerializeColor2(); 
    _color1 = value; 
    if (_resetColor2) 
     ResetColor2(); 
    Invalidate(); 
    } 
} 
// Defaults Color 1 
private Color DefaultColor1 { get { return SystemColors.Highlight; } } 
public bool ShouldSerializeColor1() 
{ 
    return !Color1.Equals(Color.Empty) && !Color1.Equals(DefaultColor1); 
} 
public void ResetColor1() 
{ 
    Color1 = DefaultColor1; 
} 

// Color 2 stuff 
private Color _color2 = Color.Empty; 
public System.Drawing.Color Color2 
{ 
    get { return _color2; } 
    set 
    { 
    _color2 = value; 
    Invalidate(); 
    } 
} 
private Color DefaultColor2 { get { return ControlPaint.Light(Color1); } } 
public bool ShouldSerializeColor2() 
{ 
    return !Color2.Equals(DefaultColor2); 
} 
public void ResetColor2() 
{ 
    Color2 = DefaultColor2; 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    using (LinearGradientBrush b = new LinearGradientBrush(ClientRectangle, Color1, Color2, LinearGradientMode.ForwardDiagonal)) 
    e.Graphics.FillRectangle(b, this.ClientRectangle); 
} 

protected override void OnSystemColorsChanged(EventArgs e) 
{ 
    base.OnSystemColorsChanged(e); 

    if (_resetColor2) 
    ResetColor2(); 
} 
} 

如果你把這個控件到窗體上,該代碼將執行以下操作:

  • 默認COLOR1到SystemColors.Highlight

  • 默認COLOR2到較亮的顏色

  • 如果COLOR2不手動改變,它會自動從COLOR1

  • 如果系統顏色在運行時,COLOR1和COLOR2改變導出將兩者變化

  • 如果系統顏色更改在設計時,只有COLOR1將改變

+0

我們可以看到一些代碼嗎?我想我有可能是解決方案的原因,但我想確保這一點。 – Amedio 2011-05-04 12:01:05

回答

1

如果事件在設計模式中被抑制,我不會感到驚訝,SystemEvents因爲是靜態事件而非常棘手。通過在屬性設置器中爲Color2設置布爾標誌來解決您的問題,以指示它與默認顏色相匹配。設置標誌時始終使用ControlPaint.Light()。

+0

你就在那裏,'SystemEvents.DisplaySettingsChanged'被抑制。 'SystemEvents.UserPreferenceChanged'似乎工作,但你的方法似乎更容易處理。我會檢查兩種方法,然後選擇更容易的方法。 – takrl 2011-05-04 13:40:48

1

您可以訂閱SystemEvents.DisplaySettingsChanged事件,我相信。

+0

關閉,感謝指針。看起來好像'SystemEvents.UserPreferenceChanged'在設計模式下工作。我現在需要進行廣泛的測試... – takrl 2011-05-04 13:25:33

相關問題