C#TreeView.EnsureVisible() - 我怎么滚动?

时间:2014-08-17 19:24:26

标签: c# treeview

在我的Treeview上:Left是EnsureVisible()之前的TreeView,而Right是After

图标被忽略。我无法弄清楚在使用EnsureVisible()之后如何显示图标,我会使用EnsureVisible()的替代方法,但我找不到任何手动滚动的方法。在那儿? 也许一些带有user32.dll的NativeMethods或什么?

enter image description here

"左:在EnsureVisible之前的TreeView,右边:在"

之后

1 个答案:

答案 0 :(得分:2)

你必须使用一点外在的魔法:

using System.Runtime.InteropServices;
//..

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetScrollPos(IntPtr hWnd, int nBar);

[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

private const int SB_HORZ = 0x0;
private const int SB_VERT = 0x1;

 // bring your node into the display
someNode.EnsureVisible();

// now you can scroll back all the way to the left:
SetScrollPos(treeView1.Handle, SB_HORZ, 0, true);
// ..or just a few pixels:
int spos = GetScrollPos( treeView1.Handle, SB_HORZ);
SetScrollPos(treeView1.Handle, SB_HORZ, spos - 20, true);

或者你可以使用SB_VERT常量使用此函数进行整个滚动。您必须计算所选节点的位置(以像素为单位),这可能是痛苦 ..

如果看到闪烁,则应将滚动包裹在SuspendLayout()ResumeLayout()块中。