我有一個用戶控件(從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將改變
我們可以看到一些代碼嗎?我想我有可能是解決方案的原因,但我想確保這一點。 – Amedio 2011-05-04 12:01:05