窗口形式的树视图中的 AutoResize 属性

Posted

技术标签:

【中文标题】窗口形式的树视图中的 AutoResize 属性【英文标题】:AutoResize property in treeview in window form 【发布时间】:2019-12-21 05:50:06 【问题描述】:

我想根据树节点调整树视图的大小。当它展开时我想显示所有项目但是当它折叠时我想只显示根节点并降低树视图的高度。我刚刚尝试过任何类似于自动调整大小的属性,但没有找到。如果有人帮助我解决这个问题,那就太好了。

【问题讨论】:

QTreeViewTreeView 不同。我注意到你问过关于TreeView 的问题,但使用了QTreeView 标签。哪一个是正确的? 【参考方案1】:

您可以向TreeView 发送TVM_GETNEXTITEM 消息,将TVGN_LASTVISIBLE 作为wParam 传递以获取树视图的最后一个节点的句柄。

然后可以调用内部NodeFromHandle方法从句柄中获取节点。然后你可以使用节点的Bound 属性来找到它的边界。最后一项的Top + Height,确定TreeView所需的高度:

const int TVM_GETNEXTITEM = 0x1100 + 10;
const int TVGN_LASTVISIBLE = 0x000A;
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);

void AdjustTreeViewHeight(TreeView treeView)

    treeView.Scrollable = false;
    var nodeHandle = SendMessage(treeView.Handle, TVM_GETNEXTITEM, 
        TVGN_LASTVISIBLE, IntPtr.Zero);
    var node = treeView.GetType().GetMethod("NodeFromHandle",
        System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
        .Invoke(treeView, new object[]  nodeHandle ) as TreeNode;
    var r = node.Bounds;
    treeView.Height = r.Top + r.Height + 4;

在添加/删除节点后,在AfterCollapseAfterExpand 中调用上述方法:

【讨论】:

以上是关于窗口形式的树视图中的 AutoResize 属性的主要内容,如果未能解决你的问题,请参考以下文章

以 Autolayout 视觉形式调整子视图的大小

iphone/ipad - 使用 Autoresize 和 addSubview 出现问题

树视图中任何项目的 OnExpanded 事件

WPF MVVM绑定窗口图标到视图模型中的属性

QTreeView 显示的树区域未扩展到其父窗口小部件?

r R中的树