2014-03-03 51 views
4

我不知道如何禁用的WinForms TreeView節點焦點矩形的,我已經嘗試了處理AfterSelect但選擇還有FocusCues仍然出現了一秒鐘,然後消失禁用TreeView節點焦點提示

代碼

public class CustomTreeView : TreeView 
{ 
    protected override void OnDrawNode(DrawTreeNodeEventArgs e) 
    { 
     e.DrawDefault = true; 
     base.OnDrawNode(e); 
    } 

    protected override void OnAfterSelect(TreeViewEventArgs e) 
    { 
     SelectedNode = null; 
     base.OnAfterSelect(e); 
    } 
} 
+0

@ANYONE>>>> –

回答

1

我爲你創建了一個示例類。它繼承了TreeView類,並引入了新的屬性DrawElements。默認情況下,兩個焦點rect &選擇都啓用。要禁用某個元素,請調整DrawElements屬性的值。要將兩者都禁用,請將其值設爲0

[Flags] 
public enum TreeViewDrawElements 
{ 
    FocusRect = 1, 
    Selection = 2 
} 

public sealed class MyTreeView : TreeView 
{ 
    public MyTreeView() 
    { 
     DrawMode = TreeViewDrawMode.OwnerDrawText; 
     DrawElements = TreeViewDrawElements.FocusRect | TreeViewDrawElements.Selection; 
    } 

    [DefaultValue(TreeViewDrawElements.FocusRect | TreeViewDrawElements.Selection)] 
    public TreeViewDrawElements DrawElements { get; set; } 

    protected override void OnDrawNode(DrawTreeNodeEventArgs e) 
    { 
     base.OnDrawNode(e); 
     if (DrawElements == (TreeViewDrawElements.FocusRect | TreeViewDrawElements.Selection)) 
     { 
      e.DrawDefault = true; 
      return; 
     } 
     TreeNode node = e.Node; 
     Rectangle bounds = node.Bounds; 
     Graphics g = e.Graphics; 
     Size textSize = TextRenderer.MeasureText(node.Text, node.TreeView.Font); 
     Point textLoc = new Point(bounds.X - 1, bounds.Y); // required to center the text 
     bounds = new Rectangle(textLoc, new Size(textSize.Width, bounds.Height)); 
     Font font = node.NodeFont ?? node.TreeView.Font; 
     bool selected = (DrawElements & TreeViewDrawElements.Selection) != 0 && (e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected; 
     Color color = (selected && node.TreeView.Focused) ? SystemColors.HighlightText : (node.ForeColor != Color.Empty) ? node.ForeColor : node.TreeView.ForeColor; 

     g.FillRectangle(selected ? SystemBrushes.Highlight : SystemBrushes.Window, bounds); 
     if ((DrawElements & TreeViewDrawElements.FocusRect) != 0 && (e.State & TreeNodeStates.Selected) != 0) 
      ControlPaint.DrawFocusRectangle(g, bounds, color, SystemColors.Highlight); 
     TextRenderer.DrawText(g, e.Node.Text, font, bounds, color, TextFormatFlags.Default); 
    } 
} 

用例:

MyTreeView tree = new MyTreeView { DrawElements = TreeViewDrawElements.Selection }; 
tree.Nodes.Add("aaa"); 
tree.Nodes.Add("bbb"); 
tree.Nodes.Add("ccc"); 
+0

非常好,我已經優化的代碼一點點,增加2個新的可能有用的功能和編輯你的答案 –