加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 禁用TreeView Node Focus Cue

发布时间:2020-12-15 22:02:08 所属栏目:百科 来源:网络整理
导读:我想知道如何在WinForms TreeView上禁用节点焦点矩形,我已经尝试过处理AfterSelect但是选择以及FocusCues仍然会出现一秒钟然后消失 码 public class CustomTreeView : TreeView{ protected override void OnDrawNode(DrawTreeNodeEventArgs e) { e.DrawDefau
我想知道如何在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.默认情况下,重点是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,TextFormatFlags.Default);
    }
}

用法示例:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读