积极答复者
如何实现点击treeview的一个有效的节点时,关闭其它展开的节点?

问题
-
如下代码:
<sdk:TreeView x:Name="tvReport" >
<sdk:TreeViewItem Header="A" >
<sdk:TreeViewItem Header="A1">
<sdk:TreeViewItem Header="A11" TabIndex="1" Tag="L001MRpt" />
<sdk:TreeViewItem Header="A12" TabIndex="2" Tag="L001MRpt" />
<sdk:TreeViewItem Header="A13" TabIndex="3" Tag="L001MRpt" />
</sdk:TreeViewItem>
<sdk:TreeViewItem Header="B">
<sdk:TreeViewItem Header="B1">
<sdk:TreeViewItem Header="B11" Tag="L021MRpt"/>
<sdk:TreeViewItem Header="B12" Tag="L022MRpt"/>
<sdk:TreeViewItem Header="B13" Tag="L002MRpt"/>
</sdk:TreeViewItem>
<sdk:TreeViewItem Header="C">
<sdk:TreeViewItem Header="C11" Tag="L023MRpt" />
<sdk:TreeViewItem Header="C12" Tag="L009MRpt"/>
<sdk:TreeViewItem Header="C13" Tag="L014MRpt"/>
<sdk:TreeViewItem Header="C14" Tag="L011MRpt"/>
<sdk:TreeViewItem Header="C15" Tag="L007MRpt"/>
<sdk:TreeViewItem Header="C16" Tag="L012MRpt"/>
</sdk:TreeViewItem>
</sdk:TreeViewItem>
</sdk:TreeViewItem>
</sdk:TreeView >我是用tag来实现导航的,当点击这些Item时,想实现把那些已经展开的节点关闭。如何实现?
答案
-
using System.Windows;
using System.Windows.Controls;namespace SilverlightApplication1
{// 我不是很明白你的意思
// 不过估计你是想选中某个节点后,
// 需要收缩除此之外的其他已经展开的节点
// 这样可节省点空间,对不?
// 我认为这样做的效果,不是很好。
// 你非要这样,只好给你下面这个代码来实现。
// TFSoft - 2011/06/09public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.tvReport.SelectedItemChanged += tvReport_SelectedItemChanged;
}private void tvReport_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
CollapseOtherItems(tvReport.SelectedItem as TreeViewItem);
//这里写你的代码
}//收缩其他节点
private void CollapseOtherItems(TreeViewItem SelectedItem)
{
CollapseOtherItemsSub(tvReport.Items[0] as TreeViewItem, SelectedItem);
}
private void CollapseOtherItemsSub(TreeViewItem CurrentItem, TreeViewItem SelectedItem)
{
foreach (var Itm in CurrentItem.Items)
{
var Item = Itm as TreeViewItem;
Item.IsExpanded = IsSelectedItemParents(Item, SelectedItem) ? true : false;
CollapseOtherItemsSub(Item, SelectedItem);
}
}//检测某个节点是否是选择结点的父辈
private bool IsSelectedItemParents(TreeViewItem TestItem, TreeViewItem SelectedItem)
{
var Rlt = false;
foreach (var Itm in TestItem.Items)
{
var Item = Itm as TreeViewItem;
if (Item.Equals(SelectedItem)) { Rlt = true; break; }
if (!Rlt) { Rlt = IsSelectedItemParents(Item, SelectedItem); }
}
return Rlt;
}
}
}- 已标记为答案 Daoping Liu - MSFTModerator 2011年6月16日 10:01
全部回复
-
using System.Windows;
using System.Windows.Controls;namespace SilverlightApplication1
{// 我不是很明白你的意思
// 不过估计你是想选中某个节点后,
// 需要收缩除此之外的其他已经展开的节点
// 这样可节省点空间,对不?
// 我认为这样做的效果,不是很好。
// 你非要这样,只好给你下面这个代码来实现。
// TFSoft - 2011/06/09public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.tvReport.SelectedItemChanged += tvReport_SelectedItemChanged;
}private void tvReport_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
CollapseOtherItems(tvReport.SelectedItem as TreeViewItem);
//这里写你的代码
}//收缩其他节点
private void CollapseOtherItems(TreeViewItem SelectedItem)
{
CollapseOtherItemsSub(tvReport.Items[0] as TreeViewItem, SelectedItem);
}
private void CollapseOtherItemsSub(TreeViewItem CurrentItem, TreeViewItem SelectedItem)
{
foreach (var Itm in CurrentItem.Items)
{
var Item = Itm as TreeViewItem;
Item.IsExpanded = IsSelectedItemParents(Item, SelectedItem) ? true : false;
CollapseOtherItemsSub(Item, SelectedItem);
}
}//检测某个节点是否是选择结点的父辈
private bool IsSelectedItemParents(TreeViewItem TestItem, TreeViewItem SelectedItem)
{
var Rlt = false;
foreach (var Itm in TestItem.Items)
{
var Item = Itm as TreeViewItem;
if (Item.Equals(SelectedItem)) { Rlt = true; break; }
if (!Rlt) { Rlt = IsSelectedItemParents(Item, SelectedItem); }
}
return Rlt;
}
}
}- 已标记为答案 Daoping Liu - MSFTModerator 2011年6月16日 10:01