Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314051
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-07-07 08:08:07

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 也会找到它, 但恢复的时候就会让它全部是可见的.

* 没有找到通过操作滚动条保存和恢复视图的办法.

阅读(1643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~