技术文章

了解最新技术文章

当前位置:首页>技术文章>技术文章
全部 110 常见问题 0 技术文章 110

WPF 在两个控件之间拖放

时间:2023-04-20   访问量:1037

使用拖放框架。为要拖动的对象指定 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 绑定到视图模型的集合,因此从拖动源中删除和添加项目是为绑定源的集合实现的。

如果您只是想交换控件在视图上的位置,您也可以这样做。在这种情况下,将拖动的控件从原始父控件中移除,并将其作为子控件添加到放置目标控件中。

 


上一篇:blazor——更改数据网格中任何行的背景/文本颜色

下一篇:基础设施知识库

发表评论:

评论记录:

未查询到任何数据!

在线咨询

点击这里给我发消息 售前咨询专员

点击这里给我发消息 售后服务专员

在线咨询

免费通话

24小时免费咨询

请输入您的联系电话,座机请加区号

免费通话

微信扫一扫

微信联系
返回顶部