【发布时间】:2010-09-24 20:59:49
【问题描述】:
是否可以让 WPF 窗口/元素检测从 C# .Net 3.5 中的 Windows 资源管理器拖放文件?我找到了适用于 WinForms 的解决方案,但没有找到适用于 WPF 的解决方案。
【问题讨论】:
标签: c# wpf .net-3.5 drag-and-drop
是否可以让 WPF 窗口/元素检测从 C# .Net 3.5 中的 Windows 资源管理器拖放文件?我找到了适用于 WinForms 的解决方案,但没有找到适用于 WPF 的解决方案。
【问题讨论】:
标签: c# wpf .net-3.5 drag-and-drop
尝试以下方法:
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 来恢复被这些控件拦截的拖放事件。
【讨论】:
原来由于某种原因我不能放到我的 TextBox 上,但是放到按钮上可以正常工作。通过将 '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 用户帐户设置上。将其设置为最不安全的设置并尝试使用相同的代码。
【讨论】: