2012-03-05 93 views
5

我希望能夠在我的一些工具條中更改ToolStripComboBox控件的邊框顏色,因爲與平面樣式一起使用時,ComboBoxes的默認邊框顏色是SystemColors.Window,它基本上對工具條的默認控制顏色不可見。在Reflector中進行了大量的挖掘之後,我沒有看到任何明顯的方法來實現這一點,因爲ComboBox渲染背後的所有基礎架構都受到內部和專用接口的高度保護。用平面樣式更改ToolStripComboBox的邊框

在ToolStrips之外,我見過的一個常見的解決方案是爲ComboBox上的邊框顏色定義的子類,覆蓋WndProc,並手動繪製邊框。這不適用於ToolStripComboBox控件,因爲內部ComboBox控件是它自己的ComboBox的私有子類,我無法看到用於替換該控件的實例。

我正在考慮的另一種解決方案是將其中一個擴展的ComboBox對象放入ToolStripControlHost中,該ToolStripControlHost允許我繪製邊框,但之後必須放棄一些專業的渲染器調整。我注意到的第二個缺點是在鼠標懸停期間偶爾會出現閃爍現象。

將我的設計切換到WPF不是一個可接受的解決方案。在父級控件中繪製邊框的控件也是不可接受的,因爲這不會取代ToolStripControlHost替代方案。

有沒有人有一個聰明的解決方案來解決這個問題,或者是否有一個現有的(許可授權的)重新實現ComboBox平面樣式渲染堆棧在野外,它修復了現有的一些缺陷實施?

回答

2

這裏有一個方法,使工作...那種:)

Paint事件ToolStrip的創建事件處理程序。然後循環遍歷所有的ToolStripComboBoxes並在它們周圍畫一個矩形。

private Color cbBorderColor = Color.Gray; 
    private Pen cbBorderPen = new Pen(SystemColors.Window); 

    private void toolStrip1_Paint(object sender, PaintEventArgs e) 
    {    
     foreach (ToolStripComboBox cb in toolStrip1.Items) 
     { 
      Rectangle r = new Rectangle(
       cb.ComboBox.Location.X - 1, 
       cb.ComboBox.Location.Y - 1, 
       cb.ComboBox.Size.Width + 1, 
       cb.ComboBox.Size.Height + 1); 

      cbBorderPen.Color = cbBorderColor; 
      e.Graphics.DrawRectangle(cbBorderPen, r); 
     } 
    } 

這裏是什麼樣子(注意,您可能需要調整的ToolStrip的高度,以防止繪製邊框被切斷):

enter image description here

1

改善: 檢查工具條項目的類型, ,這樣程序不會粉碎,例如它是toolstipLabel。

foreach (var item in toolStrip1.Items) 
{ 
     var asComboBox = item as ToolStripComboBox; 
     if (asComboBox != null) 
     { 
      var location = asComboBox.ComboBox.Location; 
      var size = asComboBox.ComboBox.Size; 
      Pen cbBorderPen = new Pen(Color.Gray); 
      Rectangle rect = new Rectangle(
        location.X - 1, 
        location.Y - 1, 
        size.Width + 1, 
        size.Height + 1); 

      e.Graphics.DrawRectangle(cbBorderPen, rect); 
     } 

}