在使用.net toolStrip控件的時候, toolStrip里面的item寬度超過本身寬度時,會出現一個溢出按鈕:OverflowButton,這個按鈕是控件的一個屬性,其實也是繼承自ToolStripDropDownItem,默認樣式如下圖:
如何才能替換成像chrome書簽欄一樣的向右小箭頭呢?
本以為直接使用toolStrip.OverflowButton.BackgroundImage=Image.FromFile("OverflowArrowVertical.png")就能解決,可是這樣好像沒有任何效果。
toolStrip的Renderer屬性,能夠讓用戶使用自定義的外觀,只需要繼承ToolStripRenderer類,重寫其中的方法就能定義自己的樣式,toolStrip的RenderMode是一個枚舉值:
public enum ToolStripRenderMode { // 摘要: // Indicates that the System.Windows.Forms.ToolStrip.RenderMode is not determined // by the System.Windows.Forms.ToolStripManager or the use of a System.Windows.Forms.ToolStripRenderer // other than System.Windows.Forms.ToolStripProfessionalRenderer, System.Windows.Forms.ToolStripSystemRenderer [Browsable(false)] Custom = 0, // // 摘要: // Indicates the use of a System.Windows.Forms.ToolStripSystemRenderer to paint. System = 1, // // 摘要: // Indicates the use of a System.Windows.Forms.ToolStripProfessionalRenderer // to paint. Professional = 2, // // 摘要: // Indicates that the System.Windows.Forms.ToolStripManager.RenderMode or System.Windows.Forms.ToolStripManager.Renderer // determines the painting style. ManagerRenderMode = 3, }
可以看到,.net本身提供了4種樣式,要實現圖標替換,只需要繼承任意一個樣式並重寫OnRenderOverflowButtonBackground方法即可。代碼如下:
public class DrawOverflowButtonRenderer : System.Windows.Forms.ToolStripProfessionalRenderer { Image ofArrowVertical; public DrawOverflowButtonRenderer(Image pic) { ofArrowVertical = pic; } protected override void OnRenderOverflowButtonBackground(ToolStripItemRenderEventArgs e) { if (e.ToolStrip.OverflowButton.Enabled) { if (e.ToolStrip.OverflowButton.Pressed) { LinearGradientBrush lgb = new LinearGradientBrush(e.ToolStrip.OverflowButton.Bounds, ofPressedColor1, ofPressedColor2, ofPressedAngle); e.Graphics.FillRectangle(lgb, e.Graphics.ClipBounds); lgb.Dispose(); } else if (e.ToolStrip.OverflowButton.Selected) { LinearGradientBrush lgb = new LinearGradientBrush(e.ToolStrip.OverflowButton.Bounds, ofHighlightColor1, ofHighlightColor2, ofHighlightAngle); e.Graphics.FillRectangle(lgb, e.Graphics.ClipBounds); lgb.Dispose(); } } e.Graphics.DrawImage(ofArrowVertical, new Rectangle(0, e.ToolStrip.OverflowButton.Height - ofArrowVertical.Height, e.ToolStrip.OverflowButton.Bounds.Width, e.ToolStrip.OverflowButton.Bounds.Height)); } }
調用:this.toolStrip1.Renderer = new DrawOverflowButtonRenderer(Image.FromFile("OverflowArrowVertical.png"))便能替換圖標了,最終效果:
這個問題糾結了好久,各種谷歌百度,論壇提問都沒人解決,平時伸手黨慣了,這個控件不行就用其他控件替代,最終還是用英文在google搜了一把,在codeproject上看了老外的一個討論后得到啟示才解決這個問題。感謝萬能的谷歌!


