Vim中有一对mkview/loadview命令, 用来保存和恢复视图, TreeListView有时也需要这样的功能.
* 保存
// Key: element name(text).
// value: True for factory node
KeyValuePair<string, bool> first_visible_node_prop = new KeyValuePair<string, bool>(null, false);
KeyValuePair<string, bool> last_visible_node_prop = new KeyValuePair<string, bool>(null, false);
TreeNode first_visible_node = null;
TreeNode last_visible_node = null;
if (m_treeView.Nodes.Count > 0)
{
TreeNode tmp_first_visible = m_treeView.GetNodeAt(0, 0);
first_visible_node_prop = new KeyValuePair<string, bool>(tmp_first_visible.Text,
tmp_first_visible.Nodes.Count > 0);
// The last visible node
TreeNode tmp_last_visible = m_treeView.GetNodeAt(0,
m_treeView.ClientSize.Height -1 );
last_visible_node_prop = new KeyValuePair<string, bool>(tmp_last_visible.Text,
tmp_last_visible.Nodes.Count > 0);
// UIHelper.ErrMsgBox("[Test Only] Last Visible Node: {0}", last_visible_node_prop );
}
|
注意不要用 TreeNode.NextVisibleNode, 这个Property返回的所谓NextVisibleNode, 并不是在处理可见的TreeListView中的节点, 而是没有被折叠起来的节点, 折叠起来的节点对应 Invisible, 如果一个节点是展开的, 即使因为滚动条被隐藏在视图之外不可见, 也仍然属于 NextVisibleNode.
另外, Control 有一个方法是GetChildAtPoint, 容易与GetNodeAt 混淆, 前者是Control的通用方法, 返回的是Control, 而GetNodeAt 才是TreeListView的特有方法, 从Get的对象名字也可以看出来.
* 恢复
if (first_visible_node != null) first_visible_node.EnsureVisible();
if (last_visible_node != null)
{
// UIHelper.ErrMsgBox("[Test Only]Last Visible Node: {0}", last_visible_node.Text, last_visible_node.Nodes.Count > 0);
last_visible_node.EnsureVisible();
}
|
一开始曾尝试只用第一个可见的节点, 保证它是可见的, 但EnsureVisible只作了粗略的保证, 并不会把这个节点放在第一个可见的位置, 前后两个节点同时保证可见的, 大概可以做到恢复视图, 其实也并不精确, 比如如果找到的最后一个节点只有一半是在可见视图之内, GetNodeAt 也会找到它, 但恢复的时候就会让它全部是可见的.
* 没有找到通过操作滚动条保存和恢复视图的办法.
阅读(1691) | 评论(0) | 转发(0) |