准备把表格实现改激进
This commit is contained in:
@@ -79,49 +79,7 @@ namespace Ramitta
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 查
|
||||
public TreeNode? FindNode(IEnumerable<TreeNode> nodes, List<string> key) {
|
||||
|
||||
if(key.Count == 0) return null;
|
||||
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (node is TreeNode obj &&
|
||||
obj.Text == key[0] &&
|
||||
key.Count==1)
|
||||
{
|
||||
// 最后的层级,且符合指标的第一个值
|
||||
return obj;
|
||||
}
|
||||
|
||||
var foundNode = FindNode(node.Children, key.Skip(1).ToList());
|
||||
|
||||
if (foundNode != null)
|
||||
{
|
||||
return foundNode;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public List<TreeNode> FindAllTreeNodes(IEnumerable<TreeNode> nodes, string key, Type? targetType = null)
|
||||
{
|
||||
List<TreeNode> foundNodes = new List<TreeNode>();
|
||||
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
// 检查当前节点是否匹配
|
||||
if (node.Text == key && (targetType == null || targetType.IsAssignableFrom(node.GetType())))
|
||||
{
|
||||
foundNodes.Add(node);
|
||||
}
|
||||
|
||||
// 递归查找子节点
|
||||
foundNodes.AddRange(FindAllTreeNodes(node.Children, key, targetType));
|
||||
}
|
||||
|
||||
return foundNodes;
|
||||
}
|
||||
|
||||
#region 查(这里面的函数下一个版本全被杀)
|
||||
/// <summary>
|
||||
/// 获取所有被勾选的Checkbox节点的Tag
|
||||
/// </summary>
|
||||
@@ -181,52 +139,92 @@ namespace Ramitta
|
||||
{
|
||||
var tags = new List<string>();
|
||||
|
||||
List<TreeNode> getTreeNode = FindAllTreeNodes(Nodes, labelNodeName, typeof(LabelTreeNode));
|
||||
List<LabelTreeNode> getTreeNode = FindTreeNodes<LabelTreeNode>(Nodes, labelNodeName);
|
||||
|
||||
var labelNode = getTreeNode.Count != 0 ? getTreeNode[0] : null;
|
||||
|
||||
if (labelNode != null)
|
||||
{
|
||||
// 如果找到了Label节点,搜索其子节点
|
||||
tags.AddRange(GetCheckedCheckboxTags(labelNode.Children));
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 查
|
||||
/// <summary>
|
||||
/// 按照指定key路径查找元素(返回一个)
|
||||
/// </summary>
|
||||
public TreeNode? FindArgvNode(IEnumerable<TreeNode> nodes, List<string> key) {
|
||||
if (nodes == null) nodes = Nodes;
|
||||
if(key.Count == 0) return null;
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (node is TreeNode obj &&
|
||||
obj.Text == key[0] &&
|
||||
key.Count==1)
|
||||
{
|
||||
// 最后的层级,且符合指标的第一个值
|
||||
return obj;
|
||||
}
|
||||
|
||||
public xTreeNode? FindTreeNodes<xTreeNode>(IEnumerable<TreeNode>? nodes, string key)
|
||||
var foundNode = FindArgvNode(node.Children, key.Skip(1).ToList());
|
||||
|
||||
if (foundNode != null)
|
||||
{
|
||||
return foundNode;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public List<xTreeNode>? FindTreeNodes<xTreeNode>(IEnumerable<TreeNode>? nodes, string key)
|
||||
where xTreeNode : class
|
||||
{
|
||||
List<xTreeNode>? result = null;
|
||||
|
||||
if (nodes == null) nodes = Nodes;
|
||||
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
// 检查当前节点是否匹配
|
||||
if (node.Text == key)
|
||||
if (node.Text == key && node is xTreeNode)
|
||||
{
|
||||
return node as xTreeNode;
|
||||
if(result == null) result = new List<xTreeNode>();
|
||||
result.Add(node as xTreeNode);
|
||||
}
|
||||
// 跳过空子
|
||||
if (node.Children.Count == 0)
|
||||
continue;
|
||||
// 迭代下层
|
||||
List<xTreeNode>? res = FindTreeNodes<xTreeNode>(node.Children, key);
|
||||
|
||||
if (res == null)continue;
|
||||
|
||||
if (res.Count != 0) {
|
||||
if (result == null) result = new List<xTreeNode>();
|
||||
result.AddRange(res);
|
||||
}
|
||||
|
||||
if (node.Children == null) return null;
|
||||
|
||||
//FindTreeNodes<xTreeNode>(node.Children, key);
|
||||
}
|
||||
return null;
|
||||
// throw new NotImplementedException($"方法:{System.Reflection.MethodBase.GetCurrentMethod()?.Name}的targetNode为空");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// 改这个玩意
|
||||
public xControl? Find<xTreeNode, xControl>(IEnumerable<TreeNode>? nodes, string key)
|
||||
where xTreeNode : class
|
||||
where xControl : DependencyObject
|
||||
{
|
||||
if (nodes == null) nodes = Nodes;
|
||||
xTreeNode targetNode = FindTreeNodes<xTreeNode>(nodes, key);
|
||||
if (targetNode == null)
|
||||
throw new NotImplementedException($"方法:{System.Reflection.MethodBase.GetCurrentMethod()?.Name}的targetNode为空");
|
||||
return To<xTreeNode, xControl>(targetNode);
|
||||
|
||||
xTreeNode? targetNode = FindTreeNodes<xTreeNode>(nodes, key)[0];
|
||||
|
||||
if (targetNode == null)
|
||||
return null;
|
||||
else
|
||||
return To<xTreeNode, xControl>(targetNode);
|
||||
}
|
||||
|
||||
|
||||
public xControl? To<xTreeNode, xControl>(xTreeNode node)
|
||||
where xTreeNode : class
|
||||
where xControl : DependencyObject
|
||||
@@ -241,22 +239,21 @@ namespace Ramitta
|
||||
return xCtrl;
|
||||
}
|
||||
}
|
||||
throw new NotImplementedException(
|
||||
$"方法:{System.Reflection.MethodBase.GetCurrentMethod()?.Name}的{treeViewItem}为空");
|
||||
}
|
||||
|
||||
private TreeViewItem FindTreeViewItem<T>(ItemsControl container, T xTreeNode) where T : class
|
||||
return null;
|
||||
}
|
||||
private TreeViewItem? FindTreeViewItem<T>(ItemsControl container, T xTreeNode) where T : class
|
||||
{
|
||||
for (int i = 0; i < container.Items.Count; i++)
|
||||
{
|
||||
TreeViewItem item = container.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
|
||||
TreeViewItem? item = container.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
|
||||
if (item != null)
|
||||
{
|
||||
if (item.DataContext == xTreeNode)
|
||||
{
|
||||
return item;
|
||||
}
|
||||
TreeViewItem childItem = FindTreeViewItem<T>(item, xTreeNode);
|
||||
TreeViewItem? childItem = FindTreeViewItem<T>(item, xTreeNode);
|
||||
if (childItem != null)
|
||||
{
|
||||
return childItem;
|
||||
@@ -265,7 +262,6 @@ namespace Ramitta
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject
|
||||
{
|
||||
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
|
||||
|
||||
Reference in New Issue
Block a user