即将大削TreeList

This commit is contained in:
2025-09-03 10:34:45 +08:00
parent 6de9a56916
commit 31d3517ecb
92 changed files with 719 additions and 89 deletions

View File

@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
@@ -18,12 +19,19 @@ using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Xml.Linq;
using static System.Net.Mime.MediaTypeNames;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Ramitta
{
public partial class winTreeList : UserControl
public partial class winTreeList : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public winTreeList()
{
InitializeComponent();
@@ -53,32 +61,89 @@ namespace Ramitta
#endregion
#region
#region
public LabelTreeNode AddLabelNode(string text, TreeNode? parent = null)
{
var node = new LabelTreeNode { Text = text };
AddNode(node, parent);
return node;
}
public CheckboxTreeNode AddCheckboxNode(string text, string? tag=null, bool isChecked = false, TreeNode? parent = null)
{
var node = new CheckboxTreeNode {
Text = text,
IsChecked = isChecked,
Tag = tag ?? text };
AddNode(node, parent);
return node;
}
public ComboboxTreeNode AddComboboxNode(string text, string[]? item=null, TreeNode? parent = null)
{
var node = new ComboboxTreeNode {
Text = text,
ComboBoxItems = new ObservableCollection<string>(item ?? []),
var label = new Label()
{
Content = text
};
var node = new LabelTreeNode
{
Text = text,
obj = label
};
AddNode(node, parent);
return node;
}
public CheckboxTreeNode AddCheckboxNode(string text, string? tag = null, bool isChecked = false, TreeNode? parent = null)
{
var checkbox = new CheckBox()
{
IsChecked = isChecked,
Content = text,
Tag = tag ?? text,
ToolTip = tag ?? text,
VerticalAlignment = VerticalAlignment.Center
};
// 处理选中状态变化
checkbox.Checked += (s, e) => OnCheckboxStateChanged(checkbox, true);
checkbox.Unchecked += (s, e) => OnCheckboxStateChanged(checkbox, false);
var node = new CheckboxTreeNode
{
Text = text,
obj = checkbox
};
AddNode(node, parent);
return node;
}
public ComboboxTreeNode AddComboboxNode(string text, List<string>? items = null, TreeNode? parent = null)
{
var combobox = new ComboBox()
{
SelectedIndex = 0,
VerticalAlignment = VerticalAlignment.Center,
MinWidth = 100
};
// 处理选择改变事件
combobox.SelectionChanged += (s, e) =>
{
if (combobox.SelectedItem is string selected)
{
OnComboboxSelectionChanged(combobox, selected);
}
};
var node = new ComboboxTreeNode
{
Text = text,
obj = combobox
};
AddNode(node, parent);
return node;
}
// 可选:添加事件处理方法
private void OnCheckboxStateChanged(CheckBox checkbox, bool isChecked)
{
// 这里可以处理复选框状态变化逻辑
Debug.WriteLine($"Checkbox '{checkbox.Tag}' changed to: {isChecked}");
}
private void OnComboboxSelectionChanged(ComboBox combobox, string selectedValue)
{
// 这里可以处理组合框选择变化逻辑
Debug.WriteLine($"Combobox selection changed to: {selectedValue}");
}
#endregion
#region ()
@@ -92,9 +157,9 @@ namespace Ramitta
var tags = new List<string>();
foreach (var node in nodes)
{
if (node is CheckboxTreeNode checkboxNode && checkboxNode.IsChecked)
if (node is CheckboxTreeNode checkboxNode && (checkboxNode.obj.IsChecked ?? false))
{
tags.Add(checkboxNode.Tag);
tags.Add(checkboxNode.obj.Tag.ToString());
}
// 递归查找子节点
@@ -113,9 +178,9 @@ namespace Ramitta
var tags = new List<string>();
foreach (var node in nodes)
{
if (node is CheckboxTreeNode checkboxNode && checkboxNode.IsChecked != true)
if (node is CheckboxTreeNode checkboxNode && checkboxNode.obj.IsChecked != true)
{
tags.Add(checkboxNode.Tag);
tags.Add(checkboxNode.obj.Tag.ToString());
}
// 递归查找子节点
@@ -124,34 +189,6 @@ namespace Ramitta
return tags;
}
public List<CheckboxTreeNode> GetNoCheckBoxNodes(bool check)
{
return GetAllNodes().OfType<CheckboxTreeNode>().
Where(n =>
(check ? n.IsChecked : !n.IsChecked)
).ToList();
}
/// <summary>
/// 获取指定Label节点下所有被勾选的Checkbox节点的Tag列表
/// </summary>
/// <param name="labelNodeName">Label节点的名称</param>
/// <returns>被勾选Checkbox节点的Tag列表</returns>
public List<string> GetCheckboxTagsUnderLabelNode(string labelNodeName)
{
var tags = new List<string>();
List<LabelTreeNode> getTreeNode = FindTreeNodes<LabelTreeNode>(Nodes, labelNodeName);
var labelNode = getTreeNode.Count != 0 ? getTreeNode[0] : null;
if (labelNode != null)
{
tags.AddRange(GetCheckedCheckboxTags(labelNode.Children));
}
return tags;
}
#endregion
#region
@@ -211,6 +248,8 @@ namespace Ramitta
}
return result;
}
// 改这个玩意
public xControl? Find<xTreeNode, xControl>(IEnumerable<TreeNode>? nodes, string key)
where xTreeNode : class
@@ -281,6 +320,10 @@ namespace Ramitta
return null;
}
public JObject JsonPrint(IEnumerable<TreeNode>? nodes, int loop = 0)
{
// 如果传入的节点为空,使用默认的 Nodes 集合
@@ -298,14 +341,14 @@ namespace Ramitta
if (node.GetType() == typeof(CheckboxTreeNode))
{
nodeObject["IsChecked"] = (node as CheckboxTreeNode)?.IsChecked.ToString();
nodeObject["IsChecked"] = (node as CheckboxTreeNode)?.obj.IsChecked.ToString();
}
if (node.GetType() == typeof(ComboboxTreeNode))
{
var target = node as ComboboxTreeNode;
nodeObject["SelectedItem"] = target?.SelectedItem.ToString();
nodeObject["SelectedItem"] = target?.obj.SelectedItem.ToString();
}
@@ -416,15 +459,48 @@ namespace Ramitta
}
#region
public abstract class TreeNode
public abstract class TreeNode : INotifyPropertyChanged
{
public TreeNode()
private string _text;
private ObservableCollection<TreeNode> _children;
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
Children = new ObservableCollection<TreeNode>();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string Text { get; set; }
public ObservableCollection<TreeNode> Children { get; set; }
public TreeNode()
{
_children = new ObservableCollection<TreeNode>();
}
public string Text
{
get => _text;
set
{
if (_text != value)
{
_text = value;
OnPropertyChanged(nameof(Text));
}
}
}
public ObservableCollection<TreeNode> Children
{
get => _children;
set
{
if (_children != value)
{
_children = value;
OnPropertyChanged(nameof(Children));
}
}
}
}
/// <summary>
@@ -432,15 +508,41 @@ namespace Ramitta
/// </summary>
public class LabelTreeNode : TreeNode
{
private Label _obj;
public Label obj
{
get => _obj;
set
{
if (_obj != value)
{
_obj = value;
OnPropertyChanged(nameof(obj));
}
}
}
}
/// <summary>
/// Label类型的树节点
/// Combobox类型的树节点
/// </summary>
public class ComboboxTreeNode : TreeNode
{
public string SelectedItem { get; set; }
public ObservableCollection<string> ComboBoxItems { get; set; } = new ObservableCollection<string>();
private ComboBox _obj;
public ComboBox obj
{
get => _obj;
set
{
if (_obj != value)
{
_obj = value;
OnPropertyChanged(nameof(obj));
}
}
}
}
/// <summary>
@@ -448,20 +550,20 @@ namespace Ramitta
/// </summary>
public class CheckboxTreeNode : TreeNode
{
public string Tag { get; set; }
private bool _isChecked;
public bool IsChecked
private CheckBox _obj;
public CheckBox obj
{
get { return _isChecked; }
get => _obj;
set
{
if (_isChecked != value)
if (_obj != value)
{
_isChecked = value;
_obj = value;
OnPropertyChanged(nameof(obj));
}
}
}
}
#endregion
}