像這樣簡單的進行一些自定義的繪製,在大部分情況下就滿足客戶的需求了。要做到它其實很簡單,重點就是:
DrawNode += CustomDrawNode;
把DrawMode這個屬性改變以後,繪製每一個菜單項的權利都交到你手裏了。然後在你的CustomDrawNode中根據你的想法來繪製每一項:
{
//如果按照默認實現來繪製,就這樣做
if (e.Node.Level > 0)
{
e.DrawDefault = true;
return;
}
//繪製的工作就完全是GDI+的那一套了
LinearGradientMode mode = LinearGradientMode.Vertical;
Rectangle rect = e.Bounds;
//繪製漸變背景
using (LinearGradientBrush brush = new LinearGradientBrush(rect, _startColor, _endColor, mode))
{
e.Graphics.FillRectangle(brush, rect);
}
Font nodeFont = _defaultFont;
//繪製加減號,做了一些硬編碼
e.Graphics.DrawImage((e.Node.IsExpanded ? _minusImage : _plusImage), e.Bounds.Location.X + 5, e.Bounds.Location.Y + 3);
//繪製文字
e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.Black, (e.Bounds.Location.X + 20), (e.Bounds.Location.Y));
}
完整的代碼在這裏,放大縮小的圖片借用自google doc。由於我們始終是在TreeView控件基礎上自定義,所以受其限制,繪製的矩形不能超出每個菜單項的高度,因此想讓字號變大,或者增加其他的控件在裏面就相當困難了。還好這個實現已經滿足了我項目的基本要求。如果你沒那麼幸運,就看看這個新的TreeView控件,它的功能極其強大,並且性能遠比默認的TreeView要好,最重要的是,它是免費且開源的。只是使用難度頗大,擴展也挺麻煩,所以還算不上是一款卓越的控件。
如果只是想對默認TreeView進行深度挖掘,這個頁面是可以教你怎麼開始。