一个可拖拉实现列表排序的WPF开源控件

推荐一个可通过拖拉,来实现列表元素的排序的WPF控件。

项目简介

gong-wpf-dragdrop是一个开源的.NET项目,用于在WPF应用程序中实现拖放功能,可以让开发人员快速、简单的实现拖放的操作功能。

可以在同一控件内或不同控件之间拖动数据以重新排序,支持插入、移动、复制到同一个或另一个控件集合中去,并支持操作预览效果功能。

支持控件有:ListBox、ListView、TreeView和DataGrid、及其他ItemsControl。

技术栈

1、支持: .NET Framework 4.6.2+、.NET Core 3.1、.NET 5 和 .NET 6。

项目结构

f1d96210ef87074a821a9e049d7efb2e.png

部分效果截图

ListBox

07bf28a3cf7163732636191d8ff4ad4f.png

08a54bc22f4a5d8b0e01549dd4dfe087.png

ListView

538b00f59681460de2090dfee53282d5.png

TreeView

0fffaa7c3cf38abc30f581d449261a53.png

DataGrid

da125f3f1c00ff2e5b72eb9dcab1cdbe.png

Tabcontrol

3825ce2711ca9e3327f58b18fee97a31.png

自定义样式

7384fc21242e93a8718ac825121555fb.png

f3c0fe84776a3ed90fb23d1d727492bb.png

项目地址

https://github.com/punker76/gong-wpf-dragdrop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF 拖拉控件的代码可以通过实现 Thumb 和 DragDelta 事件来实现。在 Thumb 控件上添加 PreviewMouseLeftButtonDown 事件,添加 DragDelta 事件,在 DragDelta 事件获取拖拽的 delta 值,然后更新控件的位置即可。 ### 回答2: WPF(Windows Presentation Foundation)是Microsoft开发的一种图形用户界面技术,可以构建富交互式的应用程序。在WPF实现控件拖拉的代码可以使用拖放机制来完成。 首先,我们需要在XAML定义一个需要拖拉控件。例如,我们可以在Grid布局添加一个Button控件,如下所示: ```xml <Grid> <Button Content="拖动我" Width="100" Height="50" DragEnter="Button_DragEnter" DragLeave="Button_DragLeave" MouseMove="Button_MouseMove"/> </Grid> ``` 接下来,在后台的C#代码,我们需要处理拖放事件和鼠标移动事件。首先,我们需要定义拖动的起始位置和保存拖动的数据。 ```csharp private Point startPoint; private DataObject dataObject; ``` 然后,在鼠标移动事件(Button_MouseMove),我们可以获取鼠标的当前位置,并计算出拖动的距离。然后,我们可以在DataObject保存相关的数据。 ```csharp private void Button_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Point currentPoint = e.GetPosition(null); Vector distance = startPoint - currentPoint; if (Math.Abs(distance.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(distance.Y) > SystemParameters.MinimumVerticalDragDistance) { dataObject = new DataObject(); dataObject.SetData("Button", sender as Button); DragDrop.DoDragDrop(sender as DependencyObject, dataObject, DragDropEffects.Move); } } } ``` 接下来,我们需要处理拖入和拖出事件(DragEnter和DragLeave)。在这些事件,我们可以设置相关控件的效果,例如改变鼠标指针的样式。 ```csharp private void Button_DragEnter(object sender, DragEventArgs e) { Button button = e.Data.GetData("Button") as Button; button.Background = Brushes.Red; } private void Button_DragLeave(object sender, DragEventArgs e) { Button button = e.Data.GetData("Button") as Button; button.Background = Brushes.Transparent; } ``` 最后,在XAML,我们需要给需要接受拖放的控件添加相应的事件处理程序。例如,我们可以给Grid布局添加拖放事件处理程序: ```xml <Grid AllowDrop="True" DragEnter="Grid_DragEnter" DragOver="Grid_DragOver" Drop="Grid_Drop"> <!-- 添加其他需要的控件 --> </Grid> ``` 在事件处理程序,我们可以获取拖放的数据,并根据需要进行相应的操作。例如,我们可以将Button控件从原来的位置移动到拖放的位置。 ```csharp private void Grid_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("Button")) { e.Effects = DragDropEffects.Move; } else { e.Effects = DragDropEffects.None; } } private void Grid_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("Button")) { e.Effects = DragDropEffects.Move; } else { e.Effects = DragDropEffects.None; } } private void Grid_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("Button")) { Button button = e.Data.GetData("Button") as Button; Grid grid = sender as Grid; if (grid != null) { // 移动Button控件到拖放的位置 grid.Children.Add(button); } } } ``` 通过以上代码,我们可以实现WPF控件拖拉功能。在鼠标移动过程,我们设置了一定的拖动距离阈值,保证只有在鼠标移动一定距离之后,才会触发拖放操作。在处理拖放事件时,我们可以根据不同的情况进行相应的操作,例如改变控件的效果、位置等。 ### 回答3: WPF(Windows Presentation Foundation)是一种用于创建可视化用户界面的微软技术。要实现控件拖拉功能,可以按照以下步骤进行编写代码: 1. 创建一个WPF应用程序,可以在XAML文件添加所需的控件,如按钮、文本框等。 2. 在XAML文件控件设置拖拉功能。可以使用拖拉事件(DragEnter、DragOver、DragDrop等)和拖拉操作(DoDragDrop)。 ``` <Button Content="拖拉我" DragEnter="Button_DragEnter" DragOver="Button_DragOver" Drop="Button_Drop" /> ``` 3. 在代码文件实现拖拉功能的事件处理程序。例如,在Button_DragEnter事件设置允许拖拉的数据类型,并改变鼠标指针样式;在Button_DragOver事件处理拖拉过程的操作,如将控件随着鼠标移动;在Button_Drop事件处理拖放完成后的操作,如将拖拽的数据提取出来并在相应位置进行处理。 ``` private void Button_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.None; } } private void Button_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.None; } } private void Button_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { string data = (string)e.Data.GetData(DataFormats.Text); // 在此处处理拖放完成后的操作 } } ``` 4. 运行应用程序,可以在应用程序拖动控件,并实现相应的拖拉功能。 以上是一个简单的示例代码,可以根据具体需求进行修改和扩展。拖拉功能可以帮助用户在界面上简化操作,并提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值