WPF树控件实现节点拖动功能

本文介绍了如何在WPF中实现树控件的节点拖动功能,包括将节点拖放到目标节点的子目录和同级目录。通过EventSetter和DataTrigger结合,实现了拖动到图片和文本时的不同效果。
摘要由CSDN通过智能技术生成

需求:

    作为一名程序员,相信大家都已经接触过大名鼎鼎的原型设计工具Axure,没用过的一定要去了解一下,本文要使用WPF实现树控件节点拖动功能。

  • 实现拖动到目标节点的子目录中

       

  • 实现拖动到目标节点的同级目录中

       

实现:

原理:树节点由图片和文本构成,当拖动节点移动到目标节点的图片上时认为是拖动到目标节点的同级目录;当拖动节点到目标节点的文本上时认为是拖动到目标节点的子目录。使用EventSetter和事件实现标识是拖动到目标节点同级目录,还是拖动到目标节点子目录功能;DataTrigger实现拖动到图片上和文本上的节点显示效果。

前台代码:

<Window x:Class="DragTree.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DragTree"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <HierarchicalDataTemplate x:Key="TreeViewDropItemTemplate" ItemsSource="{Binding Childern}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="16"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <Image x:Name="img" Grid.Column="0" Margin="2,0" Source="{Binding BI}">
                    <Image.Style>
                        <Style>
                            <EventSetter Event="Image.MouseEnter" Handler="Image_MouseEnter"/>
                            <EventSetter Event="Image.MouseLeave" Handler="Image_MouseLeave"/>
                        </Style>
                    </Image.Style>
                </Image>
                <TextBlock x:Name="tb" Grid.Column="1" Text="{Binding Name}">
                    <TextBlock.Style>
                        <Style>
                            <EventSetter Event="TextBlock.MouseEnter" Handler="TextBlock_MouseEnter"/>
                            <EventSetter Event="TextBlock.MouseLeave" Handler="TextBlock_MouseLeave"/>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
                <Grid x:Name="r1" Grid.Row="1" Grid.ColumnSpan="2" Height="4" Visibility="Collapsed">
                    <Ellipse Fill="Blue" StrokeThickness="0" Width="4" Height="4" HorizontalAlignment="Left"/>
                    <Rectangle Fill="Blue" StrokeThickness="0" Height="1" VerticalAlignment="Center"/>
                </Grid>
                <Grid x:Name="r2" Grid.Row="1" Grid.Column="1" Height="4" Visibility="Collapsed">
                   
实现 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、付费专栏及课程。

余额充值