using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using Wpf.Ui.Extend.Models;
namespace Wpf.Ui.Extend.UserControls
{
public partial class MultiCheckTreeView : UserControl
{
///
/// 构造
///
public MultiCheckTreeView()
{
InitializeComponent();
}
///
/// 控件数据
///
private IList itemsSourceData;
///
/// 控件数据
///
public IList ItemsSourceData
{
get => itemsSourceData;
set
{
itemsSourceData = value;
MultiCheckTree.ItemsSource = itemsSourceData;
}
}
///
/// 获取选中所有项(父节点和子节点)
///
///
public IList CheckedItemsIgnoreRelation()
{
return GetCheckedItemsIgnoreRelation(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;
}
///
/// 私有方法,忽略层次关系的情况下,获取选中项
///
///
///
private IList GetCheckedItemsIgnoreRelation(IList list)
{
IList treeList = [];
foreach (var tree in list)
{
if (tree.IsChecked == true)
{
treeList.Add(tree);
}
//第二次调用方法时由于没有子节点即为空,所以不进行执行下面语句,跳出下面的foreach语句
foreach (var child in GetCheckedItemsIgnoreRelation(tree.Children))
{
treeList.Add(child);
}
}
return treeList;
}
private static DependencyObject VisualUpwardSearch(DependencyObject source)
{
while (source != null && source.GetType() != typeof(T))
source = VisualTreeHelper.GetParent(source);
return source;
}
///
/// 全部展开菜单事件
///
///
///
private void menuExpandAll_Click(object sender, RoutedEventArgs e)
{
if (MultiCheckTree.ItemsSource != null)
{
foreach (TreeModel tree in MultiCheckTree.ItemsSource)
{
tree.IsExpanded = true;
tree.SetChildrenExpanded(true);
}
}
}
///
/// 全部选中事件
///
///
///
private void menuSelectAll_Click(object sender, RoutedEventArgs e)
{
if (MultiCheckTree.ItemsSource != null)
{
foreach (TreeModel tree in MultiCheckTree.ItemsSource)
{
tree.IsChecked = true;
tree.SetChildrenChecked(true);
}
}
}
///
/// 选中所有子项菜单事件
///
///
///
private void menuSelectAllChild_Click(object sender, RoutedEventArgs e)
{
if (MultiCheckTree.SelectedItem != null)
{
var tree = (TreeModel)MultiCheckTree.SelectedItem;
tree.IsChecked = true;
tree.SetChildrenChecked(true);
}
}
///
/// 全部折叠菜单事件
///
///
///
private void menuUnExpandAll_Click(object sender, RoutedEventArgs e)
{
if (MultiCheckTree.ItemsSource != null)
{
foreach (TreeModel tree in MultiCheckTree.ItemsSource)
{
tree.IsExpanded = false;
tree.SetChildrenExpanded(false);
}
}
}
///
/// 全部取消选中
///
///
///
private void menuUnSelectAll_Click(object sender, RoutedEventArgs e)
{
if (MultiCheckTree.ItemsSource != null)
{
foreach (TreeModel tree in MultiCheckTree.ItemsSource)
{
tree.IsChecked = false;
tree.SetChildrenChecked(false);
}
}
}
private void treeNode_Click(object sender, RoutedEventArgs e)
{
if (VisualUpwardSearch(e.OriginalSource as DependencyObject) is TreeViewItem item)
{
item.Focus();
if (MultiCheckTree.SelectedItem != null)
{
var tree = (TreeModel)MultiCheckTree.SelectedItem;
tree.SetChildrenChecked();
tree.SetParentChecked();
}
e.Handled = true;
}
}
///
/// 鼠标右键事件
///
///
///
private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (VisualUpwardSearch(e.OriginalSource as DependencyObject) is TreeViewItem item)
{
item.Focus();
e.Handled = true;
}
}
}
}