簡體   English   中英

有沒有辦法在設計時響應系統 colors 的更改?

[英]Is there a way to respond to a change of System colors at design time?

我有一個使用漸變填充的用戶控件(源自 ContainerControl)。 第一個漸變顏色可能是也可能不是系統顏色,例如SystemColors.Highlight 第二個漸變顏色是通過ControlPaint.Light(firstColor)或類似的方法從第一個漸變顏色派生的。

我可以通過覆蓋 OnSystemColorsChanged 在運行時輕松處理更改系統OnSystemColorsChanged ,並且它可以毫無問題地工作。 但是,如果在設計時將控件放置在窗體上,然后系統 colors 發生更改,則第二種顏色保持不變,可能是由於在設計時未調用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 派生

  • 如果系統 colors 在運行時發生變化,Color1 和 Color2 都會發生變化

  • 如果系統 colors 在設計時更改,則只有 Color1 會更改

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

如果事件在設計模式下被抑制,我不會太驚訝,SystemEvents 很棘手,因為它們是 static 事件。 通過在 Color2 的屬性設置器中設置一個布爾標志來指示它與默認顏色匹配,從而解決您的問題。 設置標志時始終使用 ControlPaint.Light()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM