折叠后自动调整树视图的宽度

Posted

技术标签:

【中文标题】折叠后自动调整树视图的宽度【英文标题】:Autosize witdth of treeview after collapse 【发布时间】:2011-08-22 10:54:13 【问题描述】:

您好,

我正在寻找一种方法来将树视图的宽度设置为最大值,或者设置为其中最长的树节点的大小,无论何时折叠或打开一个节点。

我尝试过使用客户端大小.. 但这似乎不起作用。 是否有其他方法可以检查哪个节点最长并将 TreeView.Width 设置为该大小?

【问题讨论】:

为什么不做 Windows shell 现在做的事情,让 TreeView 根据所选项目和鼠标光标的位置自动水平滚动?我认为动态resize 控件并不是一个好主意。这可能会让用户非常迷失方向。 你说的是真的,我从来没有说过这个项目会面向公众。 好吧...?我不知道为什么它对你来说比对其他人更不真实。但是无所谓;您有权按照我的意愿设计您的应用程序,这就是我将其发布为评论而不是答案的原因。按照我建议的方式执行此操作的另一个原因是,没有特别简单 的方法可以满足您的要求。 TreeView 控件没有AutoSize 属性是有原因的。您将不得不遍历节点,检查长度,确定哪个是最长的,然后计算适合最长节点字符串所需的控件大小。 正在努力,但我失败了。都在故障船上!根据您的评论,我将方法更改为用户交互而不是自动。这意味着,当用户单击特定位置时,我希望控件自动调整大小。遍历节点将是一种正确的方法。请将其发布为答案,以便如果在此期间没有更好的答案,我可以接受它 【参考方案1】:

在网上搜索了一些后,我发现了这种方式:

private const int GWL_STYLE = -16;
private const int WS_VSCROLL = 0x00200000;
private const int WS_HSCROLL = 0x00100000;


[DllImport("user32.dll", ExactSpelling = false, CharSet = CharSet.Auto)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

和:

//tree = instance of a treeview
tree.AfterExpand += (s, ea) =>

    int style = GetWindowLong(tree.Handle, GWL_STYLE);
    while ((style & WS_HSCROLL) != 0)
    
        tree.Width++;
        style = GetWindowLong(tree.Handle, GWL_STYLE);
    
;

当然你也可以在按钮上使用它!

【讨论】:

以上是关于折叠后自动调整树视图的宽度的主要内容,如果未能解决你的问题,请参考以下文章

如何在初始化后调整 GridView 列的宽度?

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

iOS自动调整UITableViewHeaderFooterView.ContentView子视图中的自定义单元格宽度

jquerylimitcharwidth:允许您折叠内部文本,以便将其调整为特定宽度。

在 ConstraintLayout 中自动调整多行文本视图的大小

JavaScript jQuery LimitCharWidth:允许您折叠内部文本,以便将其调整为特定宽度。