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