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中的拖放文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

fullCalendar 中的拖放事件不起作用

使用 angular4 的拖放事件在 IE11 中不起作用

为啥这个 Selenium 的拖放 C# 代码在 Chrome 上不起作用?

Listview 和 RichTextBox 之间的拖放不起作用

拖放到 QTreeView 中的 QStandardItemModel 不起作用

为啥 Qt 中的拖放停止工作?