Files
SzmediTools/Szmedi.RvKits/UserTreeView.xaml.cs
2025-09-16 16:06:41 +08:00

266 lines
7.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using Szmedi.RvKits.Models;
namespace Szmedi.RvKits.Assists
{
/// <summary>
/// ZsmTreeView.xaml 的交互逻辑
/// </summary>
public partial class UserTreeView : UserControl
{
#region
/// <summary>
/// 控件数据
/// </summary>
private IList<TreeModel> _itemsSourceData;
#endregion
/// <summary>
/// 控件数据
/// </summary>
public IList<TreeModel> ItemsSourceData
{
get => _itemsSourceData;
set
{
_itemsSourceData = value;
UserTree.ItemsSource = _itemsSourceData;
}
}
/// <summary>
/// 构造
/// </summary>
public UserTreeView()
{
InitializeComponent();
}
/// <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;
}
#region
/// <summary>
/// 选中所有子项菜单事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void menuSelectAllChild_Click(object sender, RoutedEventArgs e)
{
if (UserTree.SelectedItem != null)
{
TreeModel tree = (TreeModel)UserTree.SelectedItem;
tree.IsChecked = true;
tree.SetChildrenChecked(true);
}
}
#endregion
#region
/// <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 == true)
{
treeList.Add(tree);
}
//第二次调用方法时由于没有子节点即为空所以不进行执行下面语句跳出下面的foreach语句
foreach (var child in GetCheckedItemsIgnoreRelation(tree.Children))
{
treeList.Add(child);
}
}
return treeList;
}
#endregion
#region TreeView右键菜单
/// <summary>
/// 全部展开菜单事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void menuExpandAll_Click(object sender, RoutedEventArgs e)
{
if (UserTree.ItemsSource != null)
{
foreach (TreeModel tree in UserTree.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)
{
if (UserTree.ItemsSource != null)
{
foreach (TreeModel tree in UserTree.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)
{
if (UserTree.ItemsSource != null)
{
foreach (TreeModel tree in UserTree.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)
{
if (UserTree.ItemsSource != null)
{
foreach (TreeModel tree in UserTree.ItemsSource)
{
tree.IsChecked = false;
tree.SetChildrenChecked(false);
}
}
}
#endregion TreeView右键菜单
#region
/// <summary>
/// 鼠标右键事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) is TreeViewItem item)
{
item.Focus();
e.Handled = true;
}
}
private static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
{
while (source != null && source.GetType() != typeof(T))
{
source = VisualTreeHelper.GetParent(source);
}
return source;
}
private void treeNode_Click(object sender, RoutedEventArgs e)
{
if (VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) is TreeViewItem item)
{
item.Focus();
if (UserTree.SelectedItem != null)
{
TreeModel tree = (TreeModel)UserTree.SelectedItem;
tree.SetChildrenChecked();
tree.SetParentChecked();
}
e.Handled = true;
}
}
#endregion
}
}