【问题标题】:Drag drop file in WPF not workingWPF中的拖放文件不起作用
【发布时间】: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 函数。

【问题讨论】:

    标签: c# wpf drag-and-drop mahapps.metro avalondock


    【解决方案1】:

    尝试将AllowDrop="True" 和相关的处理程序直接放在LayoutDocumentPane 上。

    通常,在 XAML 中,您必须在放置时将这些内容放在光标所在的 Overred FrameworkElement 上。

    【讨论】:

    • LayoutDocumentPane 没有 AllowDrop 属性 :(
    • 所以放到LayoutDocumentPane的内容上(里面的东西)。 (网格或其他东西)
    • 是的!但这样做的目的是什么?因为我正在动态创建一个堆栈面板并将其添加到 LayoutDocumentPane 内容(在子项中)以创建删除图像的选项卡。用户应将图像文件放在停靠区域而不是已创建的图像选项卡上。
    • 在内部,当 DockingManager 为空时,会暴露一个控件,在该控件上设置背景颜色等。问题是该控件在 DockingManager 样式中定义得很深。所以你不能直接插上它,除非通过使用 Blend 手动提取它来重新定义它的样式(这太无聊了)。所以要走的路是自己公开一个控件,它处理 D'n D 逻辑。
    • 请检查已编辑的问题。我用 stackpanel 尝试过同样的事情,但从未调用过拖放功能
    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多