C# 在树视图中拖动节点时显示工具提示

C# 在树视图中拖动节点时显示工具提示,c#,winforms,treeview,C#,Winforms,Treeview,当拖动节点时,尽管我得到了移动图标,但在我的示例中没有显示工具提示文本,正如在给定的SimpleExample中一样,使用Andrey Gliznetsov的方法 添加工具提示对象和使用SetToolTip方法似乎不会影响这一点。如何获得工具提示以在拖动时显示被拖动节点的文本(和图标) ]在TreeViewAdv.Input.cs中,您可以找到此方法 private void CreateDragBitmap(IDataObject data) { if (UseCol

当拖动节点时,尽管我得到了移动图标,但在我的示例中没有显示工具提示文本,正如在给定的SimpleExample中一样,使用Andrey Gliznetsov的方法

添加工具提示对象和使用SetToolTip方法似乎不会影响这一点。如何获得工具提示以在拖动时显示被拖动节点的文本(和图标)


]

在TreeViewAdv.Input.cs中,您可以找到此方法

private void CreateDragBitmap(IDataObject data)
    {
        if (UseColumns || !DisplayDraggingNodes)
            return;
这将防止在使用列时创建_dragBitmap。如果必须在不进行修改的情况下使用TreeViewAdv控件dll,则要查看工具提示,唯一的解决方法是不使用列(属性UseColumns=False)

但由于提供了源代码,您可以修改CreateDragBitmap,方法是从该方法中的第一个if语句中删除条件UseColumns,并在foreach NodeControl循环中添加一个条件,以便在绘制第一个if语句后退出:

private void CreateDragBitmap(IDataObject data)
    {
        if (!DisplayDraggingNodes) //removed UseColumns as OR condition here
            return;

        TreeNodeAdv[] nodes = data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];
        if (nodes != null && nodes.Length > 0)
        {
            Rectangle rect = DisplayRectangle;
            Bitmap bitmap = new Bitmap(rect.Width, rect.Height);
            using (Graphics gr = Graphics.FromImage(bitmap))
            {
                gr.Clear(BackColor);
                DrawContext context = new DrawContext();
                context.Graphics = gr;
                context.Font = Font;
                context.Enabled = true;
                int y = 0;
                int maxWidth = 0;
                foreach (TreeNodeAdv node in nodes)
                {
                    if (node.Tree == this)
                    {
                        int x = 0;
                        int height = _rowLayout.GetRowBounds(node.Row).Height;
                        foreach (NodeControl c in NodeControls)
                        {
                            Size s = c.GetActualSize(node, context);
                            if (!s.IsEmpty)
                            {
                                int width = s.Width;
                                rect = new Rectangle(x, y, width, height);
                                x += (width + 1);
                                context.Bounds = rect;
                                c.Draw(node, context);
                                if (UseColumns) //only show first column if using columns
                                    break;
                            }
                        }
                        y += height;
                        maxWidth = Math.Max(maxWidth, x);
                    }
                }

                if (maxWidth > 0 && y > 0)
                {
                    _dragBitmap = new Bitmap(maxWidth, y, PixelFormat.Format32bppArgb);
                    using (Graphics tgr = Graphics.FromImage(_dragBitmap))
                        tgr.DrawImage(bitmap, Point.Empty);
                    BitmapHelper.SetAlphaChanelValue(_dragBitmap, 150);
                }
                else
                    _dragBitmap = null;
            }
        }
    }
导致

如果要在拖动时查看所有列,请省略
If(UseColumns)分隔符更改,如下所示