using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; namespace HiiShe.WPFUI.Controls { public class HSTreeView : TreeView { public HSTreeView() { base.Background = Brushes.Orange; } #region 私有变量属性 /// /// 控件数据 /// private IList _itemsSourceData; #endregion /// /// 控件数据 /// public IList ItemsSourceData { get { return _itemsSourceData; } set { _itemsSourceData = value; this.ItemsSource = _itemsSourceData; } } /// /// 设置对应Id的项为选中状态 /// /// /// public int SetCheckedById(string id, IList treeList) { foreach (var tree in treeList) { if (tree.Id.Equals(id)) { tree.IsChecked = true; return 1; } if (SetCheckedById(id, tree.Children) == 1) { return 1; } } return 0; } /// /// 设置对应Id的项为选中状态 /// /// /// public int SetCheckedById(string id) { foreach (var tree in ItemsSourceData) { if (tree.Id.Equals(id)) { tree.IsChecked = true; return 1; } if (SetCheckedById(id, tree.Children) == 1) { return 1; } } return 0; } /// /// 获取选中项 /// /// public IList CheckedItemsIgnoreRelation() { return GetCheckedItemsIgnoreRelation(_itemsSourceData); } /// /// 私有方法,忽略层次关系的情况下,获取选中项 /// /// /// private IList GetCheckedItemsIgnoreRelation(IList list) { IList treeList = new List(); foreach (var tree in list) { if (tree.IsChecked) { treeList.Add(tree); } foreach (var child in GetCheckedItemsIgnoreRelation(tree.Children)) { treeList.Add(child); } } return treeList; } /// /// 选中所有子项菜单事件 /// /// /// private void menuSelectAllChild_Click(object sender, RoutedEventArgs e) { if (this.SelectedItem != null) { TreeModel tree = (TreeModel)this.SelectedItem; tree.IsChecked = true; tree.SetChildrenChecked(true); } } /// /// 全部展开菜单事件 /// /// /// private void menuExpandAll_Click(object sender, RoutedEventArgs e) { foreach (TreeModel tree in this.ItemsSource) { tree.IsExpanded = true; tree.SetChildrenExpanded(true); } } /// /// 全部折叠菜单事件 /// /// /// private void menuUnExpandAll_Click(object sender, RoutedEventArgs e) { foreach (TreeModel tree in this.ItemsSource) { tree.IsExpanded = false; tree.SetChildrenExpanded(false); } } /// /// 全部选中事件 /// /// /// private void menuSelectAll_Click(object sender, RoutedEventArgs e) { foreach (TreeModel tree in this.ItemsSource) { tree.IsChecked = true; tree.SetChildrenChecked(true); } } /// /// 全部取消选中 /// /// /// private void menuUnSelectAll_Click(object sender, RoutedEventArgs e) { foreach (TreeModel tree in this.ItemsSource) { tree.IsChecked = false; tree.SetChildrenChecked(false); } } /// /// 鼠标右键事件 /// /// /// private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) { TreeViewItem item = VisualUpwardSearch(e.OriginalSource as DependencyObject) as TreeViewItem; if (item != null) { item.Focus(); e.Handled = true; } } static DependencyObject VisualUpwardSearch(DependencyObject source) { while (source != null && source.GetType() != typeof(T)) source = VisualTreeHelper.GetParent(source); return source; } } public class TreeModel : INotifyPropertyChanged { #region 私有变量 /// /// Id值 /// private string _id; /// /// 显示的名称 /// private string _name; /// /// 图标路径 /// private string _icon; /// /// 选中状态 /// private bool _isChecked; /// /// 折叠状态 /// private bool _isExpanded; /// /// 子项 /// private IList _children; /// /// 父项 /// private TreeModel _parent; #endregion /// /// 构造 /// public TreeModel() { Children = new List(); _isChecked = false; IsExpanded = false; _icon = "/Images/16_16/folder_go.png"; } /// /// 键值 /// public string Id { get { return _id; } set { _id = value; } } /// /// 显示的字符 /// public string Name { get { return _name; } set { _name = value; } } /// /// 图标 /// public string Icon { get { return _icon; } set { _icon = value; } } /// /// 指针悬停时的显示说明 /// public string ToolTip { get { return String.Format("{0}-{1}", Id, Name); } } /// /// 是否选中 /// public bool IsChecked { get { return _isChecked; } set { if (value != _isChecked) { _isChecked = value; NotifyPropertyChanged("IsChecked"); if (_isChecked) { //如果选中则父项也应该选中 if (Parent != null) { Parent.IsChecked = true; } } else { //如果取消选中子项也应该取消选中 foreach (TreeModel child in Children) { child.IsChecked = false; } } } } } /// /// 是否展开 /// public bool IsExpanded { get { return _isExpanded; } set { if (value != _isExpanded) { //折叠状态改变 _isExpanded = value; NotifyPropertyChanged("IsExpanded"); } } } /// /// 父项 /// public TreeModel Parent { get { return _parent; } set { _parent = value; } } /// /// 子项 /// public IList Children { get { return _children; } set { _children = value; } } /// /// 设置所有子项的选中状态 /// /// public void SetChildrenChecked(bool isChecked) { foreach (TreeModel child in Children) { child.IsChecked = IsChecked; child.SetChildrenChecked(IsChecked); } } /// /// 设置所有子项展开状态 /// /// public void SetChildrenExpanded(bool isExpanded) { foreach (TreeModel child in Children) { child.IsExpanded = isExpanded; child.SetChildrenExpanded(isExpanded); } } /// /// 属性改变事件 /// public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } } }