Winform自定義繪製TreeView
阿新 • • 發佈:2019-01-10
文/renji 出處/部落格園
在Winform上開發,常常用到TreeView這個控制元件,比如我們做GIS開發就常用它來做圖層控制。TreeView有很多可以定製的屬性來改變它的外觀,但如果定製仍無法滿足你的要求,又不想花錢買更好的控制元件,就要利用TreeView提供的自定義繪製功能了。
像這樣簡單的進行一些自定義的繪製,在大部分情況下就滿足客戶的需求了。要做到它其實很簡單,重點就是:
DrawMode = TreeViewDrawMode.OwnerDrawAll;
DrawNode += CustomDrawNode;
把DrawMode這個屬性改變以後,繪製每一個選單項的權利都交到你手裡了。然後在你的CustomDrawNode中根據你的想法來繪製每一項:
private void CustomDrawNode(object sender, DrawTreeNodeEventArgs e)
{
//如果按照預設實現來繪製,就這樣做
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進行深度挖掘,這個頁面是可以教你怎麼開始。
在Winform上開發,常常用到TreeView這個控制元件,比如我們做GIS開發就常用它來做圖層控制。TreeView有很多可以定製的屬性來改變它的外觀,但如果定製仍無法滿足你的要求,又不想花錢買更好的控制元件,就要利用TreeView提供的自定義繪製功能了。
像這樣簡單的進行一些自定義的繪製,在大部分情況下就滿足客戶的需求了。要做到它其實很簡單,重點就是:
DrawMode = TreeViewDrawMode.OwnerDrawAll;
DrawNode += CustomDrawNode;
把DrawMode這個屬性改變以後,繪製每一個選單項的權利都交到你手裡了。然後在你的CustomDrawNode中根據你的想法來繪製每一項:
private void CustomDrawNode(object sender, DrawTreeNodeEventArgs e)
{
//如果按照預設實現來繪製,就這樣做
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));
}
完整的程式碼在
如果只是想對預設TreeView進行深度挖掘,這個頁面是可以教你怎麼開始。