【NXOpen C#】树列表节点拖拽

树列表的拖拽涉及三个NX的回调,需要在三个回调设置好规则之后才能进行拖拽操作

说明:示例代码回调函数

1.设置节点是否允许拖拽,下方设置的为父节点禁止拖拽。

       internal Node.DragType IsDragAllowedCallback(Tree tree, Node node, int columnId)
        {
            //是否允许拖动回调
            if (node.ParentNode != null)
            {
                return Node.DragType.All;
            }
            return Node.DragType.None;
        }

2.设置是否执行拖拽回调,执行的方式,下方为目标节点为父节点时,作为子节点放置到其中,如果有父节点,则放到该节点后面。

        /// <summary>
        /// 是否执行拖拽回调
        /// </summary>
        /// <param name="node">拖拽的节点</param>
        /// <param name="targetNode">放置到的目标节点</param>
        internal Node.DropType IsDropAllowedCallback(Tree tree, Node node, int columnId, Node targetNode, int targetColumnId)
        {
            var dropType = targetNode.ParentNode == null ? Node.DropType.On : Node.DropType.After;
            return dropType;
        }

3.拖拽回调,拖拽发生后执行此处的内容,需要手工新建与移除拖拽后目标节点。

        internal bool OnDropCallback(Tree tree, Node[] nodes, int columnId, Node targetNode, int targetColumnId, Node.DropType dropType, int dropMenuItemId)
        {
            //拖动回调
            foreach (var node in nodes)
            {
                var nodeData = NodeDataManage.First(x => x.Node == node);
                Node newNode = tree.CreateNode(node.GetColumnDisplayText(0));

                if (dropType == Node.DropType.On)
                {
                    tree.InsertNode(newNode, targetNode, null, Tree.NodeInsertOption.Last);
                }
                else if (dropType == Node.DropType.After)
                {
                    var parent = targetNode.ParentNode;
                    tree.InsertNode(newNode, parent, targetNode, Tree.NodeInsertOption.First);
                }
                newNode.SetColumnDisplayText(1, node.GetColumnDisplayText(1));
                newNode.SetColumnDisplayText(2, node.GetColumnDisplayText(2));
                newNode.DisplayIcon = node.DisplayIcon;
                newNode.SelectedIcon = node.SelectedIcon;
                tree.DeleteNode(node);
            }

            return true;
        }
要实现 WPF 节点形框的拖拽功能,可以采用以下步骤: 1. 在 XAML 中定义一个形控件,例如: ``` <TreeView x:Name="treeView"> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="AllowDrop" Value="True"/> <EventSetter Event="PreviewMouseMove" Handler="TreeViewItem_PreviewMouseMove"/> <EventSetter Event="Drop" Handler="TreeViewItem_Drop"/> </Style> </TreeView.ItemContainerStyle> </TreeView> ``` 2. 在代码中为形控件的每个节点设置拖拽事件处理程序,例如: ``` private void TreeViewItem_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { TreeViewItem treeViewItem = FindAncestor<TreeViewItem>((DependencyObject)e.OriginalSource); if (treeViewItem != null) { DragDrop.DoDragDrop(treeViewItem, treeViewItem.DataContext, DragDropEffects.Move); e.Handled = true; } } } ``` 以上代码中,当节点上鼠标左键按下并移动时,会将节点的数据上下文作为拖拽数据,执行拖拽操作。 3. 在代码中为形控件的每个节点设置放置事件处理程序,例如: ``` private void TreeViewItem_Drop(object sender, DragEventArgs e) { TreeViewItem targetItem = FindAncestor<TreeViewItem>((DependencyObject)e.OriginalSource); if (targetItem != null) { object targetData = targetItem.DataContext; object sourceData = e.Data.GetData(typeof(object)); // 将 sourceData 移动到 targetData 下面 // ... e.Handled = true; } } ``` 以上代码中,当拖拽数据被放置到节点上时,会获取目标节点的数据上下文和拖拽数据,并执行相应的操作,例如将拖拽数据移动到目标节点下面。 4. 在代码中定义一个辅助方法,用于查找节点的祖先元素,例如: ``` private static T FindAncestor<T>(DependencyObject current) where T : DependencyObject { do { if (current is T ancestor) { return ancestor; } current = VisualTreeHelper.GetParent(current); } while (current != null); return null; } ``` 以上代码中,会从当前元素开始逐级向上查找,直到找到指定类型的祖先元素,或者查找到最上层的根元素为止。 通过以上步骤,就可以实现 WPF 节点形框的拖拽功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值