我曾在Borland的Turbo c++环境中看到过这一点,但我不确定如何在我正在开发的c#应用程序中实现这一点。是否有最佳实践或陷阱需要注意?
当前回答
你需要注意一个陷阱。在拖放操作中作为数据对象传递的任何类都必须是可序列化的。因此,如果你试图传递一个对象,它不工作,确保它可以序列化,因为这几乎肯定是问题所在。这已经抓了我几次了!
其他回答
Judah Himango和Hans Passant的解决方案在设计器中可用(我目前使用VS2015):
在Windows窗体中,设置控件的AllowDrop属性,然后监听DragEnter事件和DragDrop事件。
当DragEnter事件触发时,将参数的allowedeeffect设置为非none的值(例如e.c effect = DragDropEffects.Move)。
当DragDrop事件触发时,您将得到一个字符串列表。每个字符串都是被删除文件的完整路径。
这是我用来放置文件和/或文件夹充满文件的东西。在我的例子中,我过滤的是*。DWG文件,并选择包括所有子文件夹。
fileList是一个IEnumerable或类似的在我的情况下被绑定到一个WPF控件…
var fileList = (IList)FileList.ItemsSource;
详见https://stackoverflow.com/a/19954958/492。
drop Handler…
private void FileList_OnDrop(object sender, DragEventArgs e)
{
var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop));
var files = dropped.ToList();
if (!files.Any())
return;
foreach (string drop in dropped)
if (Directory.Exists(drop))
files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories));
foreach (string file in files)
{
if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg"))
fileList.Add(file);
}
}
还有一个问题:
调用拖拽事件的框架代码会处理所有异常。您可能认为您的事件代码运行得很顺利,但它却到处都是异常。你看不到它们,因为框架窃取了它们。
这就是为什么我总是在这些事件处理程序中放入try/catch,这样我就知道它们是否抛出任何异常。我通常会放一个Debugger.Break();在接球部分。
在发布之前,在测试之后,如果一切看起来都正常,我会删除或用真正的异常处理替换这些异常。
注意windows vista/windows 7的安全权限——如果你以管理员身份运行Visual Studio,当你在Visual Studio中运行程序时,你将不能将文件从非管理员资源管理器窗口拖到程序中。拖相关事件甚至不会火!
推荐文章
- 如何从枚举中选择一个随机值?
- 驻留在App_Code中的类不可访问
- 在链式LINQ扩展方法调用中等价于'let'关键字的代码
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头
- 如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?
- VS2013外部构建错误"error MSB4019: The imported project <path> was not found"
- 从另一个列表id中排序一个列表
- 等待一个无效的异步方法
- 无法加载文件或程序集…参数不正确
- c#中枚举中的方法
- 如何从字符串中删除新的行字符?
- 如何设置一个默认值与Html.TextBoxFor?