private void OnCompleted(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); if (overlapArea == OverlapArea.Out) { return; } var draggingModel = draggingItem.DataContext as TreeViewModel; var overlapModel = overlapItem?.DataContext as TreeViewModel; /* * 1. 拖动项是目标目录时,不做移动 * 2. 拖动项是目标目录的直接或间接父节点时,不做移动 */ if (overlapModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapModel, true)) { TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } Move(draggingModel, overlapModel, false, (overlapArea & OverlapArea.Up) == OverlapArea.Up); }
private void OnCompleted(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); if (overlapArea == OverlapArea.Out) { return; } var draggingModel = draggingItem.DataContext as TreeViewModel; var overlapFolderModel = overlapItem?.DataContext as TreeViewModel; /* * 1. 拖动项是目标目录的直接子节点时,包括目标目录是根目录的情况,不做移动 * 注:目标目录是根目录时,overlapItem 是 null * 2. 拖动项是目标目录时,不做移动 * 3. 拖动项是目标目录的直接或间接父节点时,不做移动 */ if (draggingModel.Parent == overlapFolderModel || draggingModel == overlapFolderModel || overlapFolderModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapFolderModel)) { return; } //TODO Move }
/// <summary> /// 若当前节点可见: /// 1.该节点以上的父节点均得可见 /// 2.若该节点所有子节点均不可见,则该节点以下的子节点均得可见 /// </summary> public void TryFilter(Predicate <T> filter) { if (filter == null) { TreeViewModelBase.Foreach(_source, n => n.Visibility = Visibility.Visible); return; } foreach (var nodeList in _childToParentNodeStack) { nodeList.ForEach(node => { node.Visibility = filter(node) ? Visibility.Visible : Visibility.Collapsed; //父节点满足条件,则所有子节点都显示 //父节点不满足条件,则根据是否存在显示的子节点来决定 if (node.Nodes != null && node.Nodes.Any()) { if (node.Visibility == Visibility.Visible) { TreeViewModelBase.Foreach((IEnumerable <T>)node.Nodes, n => n.Visibility = Visibility.Visible); } else { node.Visibility = node.Nodes.Any(n => n.Visibility == Visibility.Visible) ? Visibility.Visible : Visibility.Collapsed; } } }); } }
private void OnOverlapItem(OverlapArea overlapArea, ListBoxItem overlapItem, ListBoxItem draggingItem) { var draggingModel = draggingItem.DataContext as TreeViewModel; draggingModel.IsDragSource = true; if (overlapArea == OverlapArea.Out) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } var overlapModel = overlapItem?.DataContext as TreeViewModel; /* * 1. 拖动项是目标目录时,不做移动 */ if (overlapModel != null && overlapModel == draggingModel) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } //根目录 if (overlapModel == null) { TreeBackground = ColorUtil.GetBrushFromString("#d6ebff"); TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); } else { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => { m.IsDragOverUp = (overlapArea & OverlapArea.Up) == OverlapArea.Up; m.IsDragOverDown = (overlapArea & OverlapArea.Down) == OverlapArea.Down; m.IsDragOverLeft = (overlapArea & OverlapArea.Left) == OverlapArea.Left; m.IsDragOverRight = (overlapArea & OverlapArea.Right) == OverlapArea.Right; m.IsDragOver = m == overlapModel; }); } }
private void OnOverlapFolder(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem) { if (overlapArea == OverlapArea.Out) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } var overlapModel = overlapItem?.DataContext as TreeViewModel; var draggingModel = draggingItem.DataContext as TreeViewModel; /* * 1. 拖动项是目标目录时,不做移动 * 2. 拖动项是目标目录的直接或间接父节点时,不做移动 */ if (overlapModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapModel, true)) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } //根目录 if (overlapModel == null) { TreeBackground = ColorUtil.GetBrushFromString("#d6ebff"); TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); } else { TreeBackground = Brushes.Transparent; overlapModel.IsExpanded = true; TreeViewModelBase.Foreach(TreeCollection, m => { m.IsDragOverUp = (overlapArea & OverlapArea.Up) == OverlapArea.Up; m.IsDragOverDown = (overlapArea & OverlapArea.Down) == OverlapArea.Down; m.IsDragOver = m == overlapModel; }); } }
private void OnOverlapItem(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem) { if (overlapArea == OverlapArea.Out) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } var overlapFolderModel = overlapItem?.DataContext as TreeViewModel; var draggingModel = draggingItem.DataContext as TreeViewModel; /* * 1. 拖动项是目标目录的直接子节点时,包括目标目录是根目录的情况,不做移动 * 注:目标目录是根目录时,overlapItem 是 null * 2. 拖动项是目标目录时,不做移动 * 3. 拖动项是目标目录的直接或间接父节点时,不做移动 */ if (draggingModel.Parent == overlapFolderModel || draggingModel == overlapFolderModel || overlapFolderModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapFolderModel)) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } if (overlapFolderModel == null) { TreeBackground = ColorUtil.GetBrushFromString("#d6ebff"); TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } else { overlapFolderModel.IsExpanded = true; TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = m == overlapFolderModel); } }
private void OnCompleted(OverlapArea overlapArea, ListBoxItem overlapItem, ListBoxItem draggingItem) { TreeBackground = Brushes.Transparent; TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = m.IsDragSource = false); if (overlapArea == OverlapArea.Out) { return; } var draggingModel = draggingItem.DataContext as TreeViewModel; var overlapModel = overlapItem?.DataContext as TreeViewModel; /* * 1. 拖动项是目标目录时,不做移动 */ if (overlapModel != null && overlapModel == draggingModel) { TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false); return; } //Move(draggingModel, overlapModel, false, (overlapArea & OverlapArea.Up) == OverlapArea.Up); }