WPF中的拖放文件不起作用
Posted
技术标签:
【中文标题】WPF中的拖放文件不起作用【英文标题】:Drag drop file in WPF not working 【发布时间】:2015-04-15 16:03:12 【问题描述】:我使用 Mahapps 进行布局,使用 AvalonDock 进行选项卡和子窗口布局。但无法使用拖放功能,因为从未调用过拖放功能。我还根据link为用户设置了(explorer和.exe)权限,但都是徒劳的。无法让这件事发挥作用。 avalondock 的背景:DockingManager 控件设置为“#FF2D2D30”。在 dockingManager 上从文件资源管理器中拖放文件时,没有任何反应。
<avalonDock:DockingManager AllowDrop="True" x:Name="dockingManager" DockPanel.Dock="Right" Theme="Binding AvalonDockTheme" PreviewDragEnter="DragFilesEntered" PreviewDrop="FilesDropped" PreviewDragOver="DragFilesEntered">
<avalonDock:LayoutRoot>
<avalonDock:LayoutPanel Orientation="Horizontal">
<avalonDock:LayoutDocumentPaneGroup>
<avalonDock:LayoutDocumentPane x:Name="layoutdoc_tabContent">
</avalonDock:LayoutDocumentPane>
</avalonDock:LayoutDocumentPaneGroup>
</avalonDock:LayoutPanel>
</avalonDock:LayoutRoot>
</avalonDock:DockingManager>
我从某个网站挑选的代码背后(C#)
private void DragFilesEntered(object sender, DragEventArgs e)
MessageBox.Show("Hey");
bool isValidFile = false;
if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
string[] filenames = (string[])e.Data.GetData(DataFormats.FileDrop, true);
foreach (string filename in filenames)
if (File.Exists(filename) == false)
isValidFile = false;
break;
FileInfo info = new FileInfo(filename);
if (!(info.Extension == ".bmp" || info.Extension == ".png" || info.Extension == ".jpg"))
isValidFile = false;
break;
if (isValidFile)
e.Effects = DragDropEffects.Move;
else
e.Effects = DragDropEffects.None;
private void FilesDropped(object sender, DragEventArgs e)
if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach(var file in files)
((MainViewModel)this.DataContext).CreateTab(layoutdoc_tabContent, file);
e.Handled = true;
编辑:
<StackPanel PreviewDragEnter="DragFilesEntered" PreviewDrop="FilesDropped" PreviewDragOver="DragFilesEntered" AllowDrop="True" Width="100" Height="100" Orientation="Horizontal" Background="#FFDA1313">
</StackPanel>
还是不行。无法调用 Drag 函数。
【问题讨论】:
【参考方案1】:尝试将AllowDrop="True"
和相关的处理程序直接放在LayoutDocumentPane
上。
通常,在 XAML 中,您必须在放置时将这些内容放在光标所在的 Overred FrameworkElement 上。
【讨论】:
LayoutDocumentPane 没有 AllowDrop 属性 :( 所以放到LayoutDocumentPane
的内容上(里面的东西)。 (网格或其他东西)
是的!但这样做的目的是什么?因为我正在动态创建一个堆栈面板并将其添加到 LayoutDocumentPane 内容(在子项中)以创建删除图像的选项卡。用户应将图像文件放在停靠区域而不是已创建的图像选项卡上。
在内部,当 DockingManager 为空时,会暴露一个控件,在该控件上设置背景颜色等。问题是该控件在 DockingManager 样式中定义得很深。所以你不能直接插上它,除非通过使用 Blend 手动提取它来重新定义它的样式(这太无聊了)。所以要走的路是自己公开一个控件,它处理 D'n D 逻辑。
请检查已编辑的问题。我用 stackpanel 尝试过同样的事情,但从未调用过拖放功能以上是关于WPF中的拖放文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 Selenium 的拖放 C# 代码在 Chrome 上不起作用?
Listview 和 RichTextBox 之间的拖放不起作用