在C# .Net 3.5中,是否有可能让WPF窗口/元素检测到从Windows资源管理器拖放文件的操作?我已经找到了WinForms的解决方案,但没有找到适用于WPF的。
在C# .Net 3.5中,是否有可能让WPF窗口/元素检测到从Windows资源管理器拖放文件的操作?我已经找到了WinForms的解决方案,但没有找到适用于WPF的。
private void MessageTextBox_Drop(object sender, DragEventArgs e)
{
if (e.Data is DataObject && ((DataObject)e.Data).ContainsFileDropList())
{
foreach (string filePath in ((DataObject)e.Data).GetFileDropList())
{
// Processing here
}
}
}
private void MessageTextBox_PreviewDragEnter(object sender, DragEventArgs e)
{
var dropPossible = e.Data != null && ((DataObject)e.Data).ContainsFileDropList();
if (dropPossible)
{
e.Effects = DragDropEffects.Copy;
}
}
private void MessageTextBox_PreviewDragOver(object sender, DragEventArgs e)
{
e.Handled = true;
}
不幸的是,TextBox、RichTextBox和FlowDocument查看器总是将拖放事件标记为已处理,这会阻止它们向上传递到您的处理程序。您可以通过强制处理拖放事件(使用UIElement.AddHandler并将handledEventsToo设置为true)并在处理程序中将e.Handled设置为false来恢复这些控件拦截拖放事件的功能。
事实证明,由于某些原因,我无法将内容拖放到文本框中,但是将其拖放到按钮上却可以正常工作。通过在窗口中添加“AllowDrop = True”并将放置事件处理程序添加到按钮中,已经成功解决了这个问题,代码如下:
private void btnFindType_Drop(object sender, DragEventArgs e)
{
if (e.Data is System.Windows.DataObject &&
((System.Windows.DataObject)e.Data).ContainsFileDropList())
{
foreach (string filePath in ((System.Windows.DataObject)e.Data).GetFileDropList())
{
// Processing here
}
}
}
我曾经遇到过类似的问题,拖放事件和拖入事件都没有被触发。问题出在Windows用户账户设置上。将其设置为最不安全的选项,然后尝试相同的代码,它就可以正常工作了。