禁用树视图节点焦点提示



我想知道如何在WinForms TreeView上禁用节点焦点矩形,我已经尝试处理AfterSelect,但选择以及FocusCues仍然出现一秒钟,然后消失

法典

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);
    }
}

我为您创建了一个示例类。它继承自 TreeView 类并引入了新的属性DrawElements。默认情况下,焦点矩形和选择都处于启用状态。若要禁用某些元素,请调整 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");

最新更新