/// <summary> /// Строим ветки, которые будем добавлять /// </summary> /// <param name="parent">Родительский объект</param> /// <param name="nodes">Список узлов для вставки/обновления который наполняем</param> /// <param name="nodePath">Дополнительный путь к узлу, в который вставляем или переносим (что-то вроде 1/1/1/)</param> private static void BuildParent(int destTreeId, int destFreeHierItemId, FreeHierarchyTreeItem parent, List <FreeHierTreeItem> nodes, bool includeChildren, string nodePath) { //Добавляем родителя nodes.Add(CreateInserted(destTreeId, destFreeHierItemId, parent, includeChildren, nodePath)); //Теперь добавляем дочерние if (parent.Children == null || parent.Children.Count == 0) { return; } var ph = 1; foreach (var child in parent.Children) { if (!child.IsSelected) { continue; } BuildParent(destTreeId, destFreeHierItemId, child, nodes, includeChildren, nodePath + ph + "/"); //Увеличиваем путь ph++; } }
private void InitVisual() { var nodeContext = DataContext as XamDataTreeNodeDataContext; if (nodeContext == null) { return; } var item = nodeContext.Data as FreeHierarchyTreeItem; if (_parentTree == null) { _parentTree = nodeContext.Node.NodeLayout.Tree.TryFindResource("treeModule") as FreeHierarchyTree; //.FindParent<FreeHierarchyTree>(); } #region Определяемся нужно ли пересоздавать контрол var isRecreateControl = _freeHierarchyTreeItem == null || item == null; if (!isRecreateControl) { var oldTypeFound = false; var newTypeFound = false; isRecreateControl = true; foreach (var notRecreatableType in _notRecreatableTypes) { if (!oldTypeFound && notRecreatableType == _freeHierarchyTreeItem.FreeHierItemType) { oldTypeFound = true; } if (!newTypeFound && notRecreatableType == item.FreeHierItemType) { newTypeFound = true; } if (oldTypeFound && newTypeFound) { isRecreateControl = false; break; } } } #endregion _freeHierarchyTreeItem = item; if (_freeHierarchyTreeItem == null || _freeHierarchyTreeItem.Descriptor == null) { return; } //MainLayout.DataContext = _freeHierarchyTreeItem; if (_outerSelector == null && _parentTree != null && _parentTree.OuterSelector != null) { _outerSelector = _parentTree.OuterSelector; } //if (_freeHierarchyTreeItem.UpdateItemContent == null) //{ // _freeHierarchyTreeItem.UpdateItemContent = UpdateItemContent; //} if (_parentTree == null) { return; } _treeDescriptor = _parentTree.GetDescriptor(); if (_treeDescriptor == null) { return; } bool isHideStandartIcon = false; //если указана пользовательская иконка то скрываем стандартные if (item != null && item.NodeIcon_ID != null) { isHideStandartIcon = true; DictNodeIcon imgBytes; GlobalTreeDictionary.DictNodeIconList.TryGetValue(item.NodeIcon_ID ?? 0, out imgBytes); if (imgBytes != null) { UserImage.Source = imgBytes.DataImage; } UserImage.Visibility = Visibility.Visible; } else if (UserImage.Visibility == Visibility.Visible) { UserImage.Visibility = Visibility.Collapsed; //TODO } //if (ccLayout.Content != null) DisposeControlContent(); UpdateItemContent(_freeHierarchyTreeItem, isRecreateControl, isHideStandartIcon); //ccLayout.Content = _freeHierarchyTreeItem.Name; }
private void UpdateItemContent(FreeHierarchyTreeItem freeHierarchyTreeItem, bool isRecreateControl = true, bool isHideStandartIcon = false) { var isSelectSingle = _treeDescriptor != null && _treeDescriptor.IsSelectSingle; if (isSelectSingle) { bMenu.Visibility = cbSelect.Visibility = Visibility.Collapsed; } //else //{ //if (bMenu.CommandTarget == null) bMenu.CommandTarget = _parentTree; //} var obj = freeHierarchyTreeItem.HierObject ?? freeHierarchyTreeItem.ItemObject; if (obj is FreeHierarchyTreeItem) { var tb = new TextBlock { Text = obj.ToString(), }; //tb.SetBinding(TextBlock.TextProperty, "StringName"); ccLayout.Content = tb; } else { var needRecreateContent = true; if (!isRecreateControl && ccLayout.Content != null) { //Универсальный контрол, пересоздавать визуальный объект не нужно, просто меняем DataContext if (ccLayout.Content is HierObject) { //fec.DataContext = obj; needRecreateContent = false; } else { var tb = ccLayout.Content as TextBlock; if (tb != null) { tb.Text = obj.ToString(); } //else //{ // var f = ccLayout.Content as FrameworkElement; // if (f != null) f.DataContext = obj; //} } } DataTemplate dt = null; if (_parentTree != null) { var parentFrame = _parentTree.PermissibleForSelectObjects; if (parentFrame != null && parentFrame.PermissibleForSelectObjects != null && parentFrame.PermissibleForSelectObjects.All(p => p != freeHierarchyTreeItem.FreeHierItemType)) { cbSelect.Visibility = Visibility.Collapsed; } else if (_outerSelector != null) { TreeMode = _parentTree.TreeMode; dt = _outerSelector.GetTemplate(freeHierarchyTreeItem, _parentTree.ExtendetTemplates, TreeMode); if (dt != null) { var tm = TreeMode.GetValueOrDefault(); if (tm == enumTreeMode.SingleObject || tm == enumTreeMode.PSSingleMode || tm == enumTreeMode.MultiTIMode || tm == enumTreeMode.Formulas || tm == enumTreeMode.OpcUa || tm == enumTreeMode.FactPower || (tm == enumTreeMode.PSMultiMode && freeHierarchyTreeItem.FreeHierItemType != EnumFreeHierarchyItemType.PS)) { cbSelect.Visibility = Visibility.Collapsed; if (tm != enumTreeMode.MultiTIMode) { bMenu.Visibility = Visibility.Collapsed; } } else if (!isSelectSingle) { cbSelect.Visibility = Visibility.Visible; } } else if (cbSelect.Visibility != Visibility.Visible) { cbSelect.Visibility = Visibility.Visible; } } else if (!isSelectSingle) { cbSelect.Visibility = Visibility.Visible; } } if (_treeDescriptor != null && _treeDescriptor.Tree_ID <= 0 && (FreeHierarchyTreeItem.NoHaveChildren.Contains(freeHierarchyTreeItem.FreeHierItemType))) { bMenu.Visibility = Visibility.Collapsed; } else if (!isSelectSingle && bMenu.Visibility != Visibility.Visible) { bMenu.Visibility = Visibility.Visible; } if (dt != null) { ccLayout.Content = dt.LoadContent(); } else if (needRecreateContent) { if (freeHierarchyTreeItem.HierObject != null) { ccLayout.Content = freeHierarchyTreeItem.HierObject.ToControl(); //content = new TextBlock { DataContext = obj }; } else { if (_parentTree != null && _parentTree.Selector != null) { dt = _parentTree.Selector.SelectTemplate(obj, null); } if (dt == null) { return; } ccLayout.Content = dt.LoadContent(); } } if (isHideStandartIcon) { var hidable = ccLayout.Content as IHideStandartIcon; if (hidable != null) { hidable.SetVisibilityStandartIcon(false); } } var fe = ccLayout.Content as FrameworkElement; if (fe != null) { if (dt == null) { fe.DataContext = obj; } else { fe.DataContext = freeHierarchyTreeItem; } } else { ccLayout.DataContext = obj; } } }
internal static FreeHierTreeItem CreateInserted(int destTreeId, int destFreeHierItemId, FreeHierarchyTreeItem item, bool includeChildren, string nodePath) { var node = new FreeHierTreeItem { FreeHierTree_ID = destTreeId, FreeHierItem_ID = item.FreeHierItem_ID, FreeHierIcon_ID = item.NodeIcon_ID, ParentFreeHierItem_ID = destFreeHierItemId, FreeHierItemType = (byte)item.FreeHierItemType, NodePath = nodePath //Нужно для сохранения структуры переносимых объектов, строго соблюдать не обязательно }; if (item.HierObject != null) { node.StringName = item.HierObject.Name; if (item.HierObject.Id > 0 && !HierarchyObjectHelper.IsStringId(item.FreeHierItemType)) { node.ObjectStringID = item.HierObject.Id.ToString(); } else { node.ObjectStringID = item.HierObject.StringId; } } else { node.StringName = item.StringName; } if (item.FreeHierItemType != EnumFreeHierarchyItemType.XMLSystem) { node.IncludeObjectChildren = includeChildren; } return(node); }