private static void ExpandAndSelectUaNodeXamTree(UaFindNodeResult findedNodeResult, XamDataTree xamTree) { if (!findedNodeResult.FdUaNodeId.HasValue) { return; } //Родитель через который идет переход на обычные узлы FreeHierarchy var parentNode = UAHierarchyDictionaries.UANodesDict[findedNodeResult.FdUaNodeId.Value]; if (parentNode == null) { return; } //Непосредственный родитель var pathToFounded = new ConcurrentStack <object>(); #if DEBUG var sw = new System.Diagnostics.Stopwatch(); sw.Start(); #endif var foundedObject = FinderHelper.FindFirstElementAsync(xamTree.ItemsSource as IEnumerable <object>, parentNode, pathToFounded); #if DEBUG sw.Stop(); Console.WriteLine("Поиск 1 {0} млс", sw.ElapsedMilliseconds); #endif var treeItem = foundedObject as FreeHierarchyTreeItem; if (treeItem != null && treeItem.Descriptor != null) { //Подгружаем объекты treeItem.ReloadUaNodeBranch(new Queue <long>(findedNodeResult.ParentIds.Skip(1))); } pathToFounded.Clear(); #if DEBUG sw.Restart(); #endif foundedObject = FinderHelper.FindFirstElementAsync(xamTree.ItemsSource as IEnumerable <object>, findedNodeResult.Node, pathToFounded); #if DEBUG sw.Stop(); Console.WriteLine("Поиск 2 {0} млс", sw.ElapsedMilliseconds); #endif //На данный момент объект подгружен, просто позиционируем на него if (foundedObject != null && pathToFounded.Count > 0) { xamTree.ExpandAndSelectXamTreeAsync(pathToFounded, false); } }
public static void ExpandAndSelectXamTree(Stack stack, object selItem, XamDataTree xamTree, bool isExpandLast = false, bool isSelect = true) { if (stack != null) { var hierItem = selItem as FreeHierarchyTypeTreeItem; if (hierItem != null) { var stackTree = new Stack <FreeHierarchyTypeTreeItem>(); for (int i = stack.Count - 1; i >= 0; i--) { stackTree.Push(stack.ToArray()[i] as FreeHierarchyTypeTreeItem); } xamTree.ExpandAndSelectXamTree(stackTree, isExpandLast, isSelect); } else { var arr = new object[stack.Count]; stack.CopyTo(arr, 0); Array.Reverse(arr); var chain = new ConcurrentStack <object>(arr); xamTree.ExpandAndSelectXamTreeAsync(chain, isExpandLast); } //MoveUp(xamTree); } // Если элемент не найден в дереве, то нужно подгрузить ветку else { var findedNodeResult = selItem as UaFindNodeResult; if (findedNodeResult != null) { ExpandAndSelectUaNodeXamTree(findedNodeResult, xamTree); //MoveUp(xamTree); } else { ExpandAndSelectHierObject(selItem, xamTree); } } }