none
如何实现点击treeview的一个有效的节点时,关闭其它展开的节点? RRS feed

  • 问题

  • 如下代码:

    <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时,想实现把那些已经展开的节点关闭。如何实现?

    2011年6月9日 6:57

答案

  • using System.Windows;
    using System.Windows.Controls;

    namespace SilverlightApplication1
    {

        // 我不是很明白你的意思
        // 不过估计你是想选中某个节点后,
        // 需要收缩除此之外的其他已经展开的节点
        // 这样可节省点空间,对不?
        // 我认为这样做的效果,不是很好。
        // 你非要这样,只好给你下面这个代码来实现。
        // TFSoft - 2011/06/09

        public 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;
            }
        }
    }

    2011年6月9日 9:22

全部回复

  • using System.Windows;
    using System.Windows.Controls;

    namespace SilverlightApplication1
    {

        // 我不是很明白你的意思
        // 不过估计你是想选中某个节点后,
        // 需要收缩除此之外的其他已经展开的节点
        // 这样可节省点空间,对不?
        // 我认为这样做的效果,不是很好。
        // 你非要这样,只好给你下面这个代码来实现。
        // TFSoft - 2011/06/09

        public 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;
            }
        }
    }

    2011年6月9日 9:22
  • 我运行,怎么不能正常!! ^_^是不是还少了什么代码?
    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年6月11日 10:07
    版主
  • TFSoft 给出的代码一贯本着负责,经过测试,能够运行的。应该可以运行。
    注:

    给出的仅仅是 C# 文件,

    xaml文件就是与提问者各处的一样,因此省略了。


    2011年6月11日 15:58
  • 我测试了一下TFSoft的代码,是可以运行的,而且符合提问者的要求。


    Daoping Liu - MSFT
    2011年6月13日 1:57
    版主
  • 那有什么好的办法来实现呢? 

    2011年7月4日 11:31