了解最新技术文章
使用拖放框架。为要拖动的对象指定 DragSource,为放置目标指定 DropTarget。在 Drop 事件的事件处理程序中,从拖动源中移除被拖动的元素并将其添加到拖动目标。
下面是在 ListView 之间拖放的代码示例。相同的概念可以用于实现其他控件,无论它们是相同的还是不同的控件。
由于我们要拖动左侧的 ListView 项,因此请为左侧的 ListView 项指定 DragSource(第 14 至 17 行)。
<网格> _ _
< Grid.ColumnDefinitions >
<列定义宽度= "*" />
<列定义宽度= "*" />
< /Grid.ColumnDefinitions >
<!-- 左侧列表视图 -->
< ListView Grid.Column = "0" ItemsSource = "{Binding Tasks1}" Margin = "10" BorderBrush = "Black" BorderThickness = "2" >
< ListView.ItemTemplate >
<数据模板> _ _
< Border BorderBrush = "LightGray" Background = "White" BorderThickness = "2" Margin = "0,0,-1,2" >
...
<!--添加拖拽源-->
< ig:DragDropManager.DragSource >
< ig:DragSource IsDraggable = "True" DragChannels = "ChannelA" Drop = "DragSource_Drop" >
</ ig:DragSource >
< /ig:DragDropManager.DragSource >
</边框> _ _
</数据模板> _ _
< /ListView.ItemTemplate >
</列表视图> _ _
<!-- 右列表视图 -->
< ListView Grid.Column = "1" ItemsSource = "{Binding Tasks2}" Margin = "10" BorderBrush = "Black" BorderThickness = "2" >
...
</列表视图> _ _
</网格> _ _
由于我们要在右侧的 ListView 上放置,因此为右侧的 ListView 设置 DropTarget(第 18-21 行)。
<网格> _ _
< Grid.ColumnDefinitions >
<列定义宽度= "*" />
<列定义宽度= "*" />
< /Grid.ColumnDefinitions >
<!-- 左侧列表视图 -->
< ListView Grid.Column = "0" ItemsSource = "{Binding Tasks1}" Margin = "10" BorderBrush = "Black" BorderThickness = "2" >
...
</列表视图> _ _
<!-- 右列表视图 -->
< ListView Grid.Column = "1" ItemsSource = "{Binding Tasks2}" Margin = "10" BorderBrush = "Black" BorderThickness = "2" >
...
< /ListView.ItemTemplate >
<!-- 添加 DropTarget -->
< ig:DragDropManager.DropTarget >
< ig:DropTarget IsDropTarget = "True" DropChannels = "ChannelA" >
</ ig:DropTarget >
< /ig:DragDropManager.DropTarget >
</列表视图> _ _
</网格> _ _
请注意,我将 DropTarget 设置为 ListView,而不是 ListView 的项目。
必须为可视化树中的 UI 元素设置 DragSource 和 DropTarget。如果在这里将DropTarget 设置为ListView item,当ListView 为空时,将无法进行drop。为避免这种情况,我在 ListView 本身上设置了 DropTarget。
取出被拖动项的实例,每个拖动源和放置目标ListViews,以及绑定到每个拖动源和放置目标ListViews的集合,从拖动源集合中移除被拖动项,并返回放置目标Add到集合。
private void DragSource_Drop (对象发送者,Infragistics.DragDrop。DropEventArgs e )
{
// 取出与拖动源 UI 元素(在本例中为 Border)关联的 TaskItem。
Border sourcePanel = e.DragSource as Border ;
TaskItem sourceTask = sourcePanel.DataContext as TaskItem ;
// 获取拖拽源ListView
// https://jp.infragistics.com/help/wpf/infragisticswpf~infragistics.windows.utilities~getancestorfromtype(dependencyobject,type,boolean)
ListView sourceListView = Utilities.GetAncestorFromType ( sourcePanel , typeof ( ListView ) , false ) as ListView;
// 获取放置目标ListView
ListView targetListView = e.DropTarget as ListView ;
// 获取绑定到拖放源和拖放目标的集合 ListViews。
ObservableCollection < TaskItem > sourceTasks = sourceListView.ItemsSource as ObservableCollection < TaskItem > ;
ObservableCollection < TaskItem > targetTasks = targetListView.ItemsSource as ObservableCollection < TaskItem > ;
// 从源集合中移除拖动的 TaskItem,并将其添加到放置目标集合中。
sourceTasks.Remove ( sourceTask ) ; _
targetTasks.Add ( sourceTask ) ; _
}
这次,ListView 的 ItemsSource 绑定到视图模型的集合,因此从拖动源中删除和添加项目是为绑定源的集合实现的。
如果您只是想交换控件在视图上的位置,您也可以这样做。在这种情况下,将拖动的控件从原始父控件中移除,并将其作为子控件添加到放置目标控件中。