zoukankan      html  css  js  c++  java
  • WPF拖拽文件(拖入拖出),监控拖拽到哪个位置,类似百度网盘拖拽

    1.往wpf中拖文件

    // xaml
    <Grid x:Name="grid_11" DragOver="Grid_11_DragOver" Drop="Grid_11_Drop" AllowDrop="True" Background="Red"/>
    // xaml.cs
    /// <summary>
    /// 包含目录文件判断
    /// </summary>
    /// <param name="files"></param>
    /// <returns></returns>
    private bool HasDirectory(string[] files)
    {
        if (files == null)
            return false;
        for (int i = 0; i < files.Length; i++)
        {
            if (System.IO.Directory.Exists(files[i]))
            {
                return true;
            }
        }
        return false;
    }
    /// <summary>
    /// 抛弃文件夹目标
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Grid_11_DragOver(object sender, DragEventArgs e)
    {
        var files = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (HasDirectory(files))
        {
            e.Effects = DragDropEffects.None;// 抛弃这一次的拖拽源
            e.Handled = true;
        }
    }
    /// <summary>
    /// 放下文件获取路径
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Grid_11_Drop(object sender, DragEventArgs e)
    {
        var files = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (files == null || HasDirectory(files))
            return;
        for(int i = 0; i < files.Length; i++)
        {
            Console.WriteLine(files[i]);
        }
    }

    2.wpf中往外拖文件

    private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)// 右键拖拽的时候,创建一个drop源
    {
        // 多文件拖拽
        #region 获取拖拽的文件的个数
        int fileCount = 1;
        #endregion
    
        FileDDWatcher.Instance.StartWatcher(fileCount);// 启动文件挪移监控,传入文件挪移的个数
    
        #region 创建临时文件并反馈临时路径,paths挪移的目标
    
        string dir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "TempDirectory");
        if (!System.IO.Directory.Exists(dir))
        {
            System.IO.Directory.CreateDirectory(dir);
        }
        string[] paths = new string[fileCount];
        for (int i = 0; i < fileCount; i++)
        {
            string path = System.IO.Path.Combine(dir, $"fileName{i}.download");
            System.IO.File.Create(path).Close();// 拖动的时候创建
            paths[i] = path;
        }
        #endregion
    
        #region 拖拽代码
    
        ListView lv = new ListView();
        string dataFormat = DataFormats.FileDrop;
        DataObject dataObject = new DataObject(dataFormat, paths);//(listview.SelectedItems.Cast<string>()).ToArray<string>());
        DragDropEffects dde = DragDrop.DoDragDrop(lv, dataObject, DragDropEffects.Copy);
    
        #endregion
    
        FileDDWatcher.Instance.StopWatcher();// 停止文件监控
    
        #region 拖拽成功之后获取目标的路径
        Console.WriteLine($"dropdrag status = {dde}");
        if (dde == DragDropEffects.Copy)// 拖拽成功
        {
            string[] ls = FileDDWatcher.Instance.GetTempFilePath();// 获取拖拽之后的目录
            if (ls != null && ls.Length > 0)
            {
                for (int i = 0; i < ls.Length; i++)
                {
                    Console.WriteLine($"Target catalogue {ls[i]}");
                }
            }
            else
            {
                Console.WriteLine("no file path copy");
            }
        }
        #endregion
    }

    监控文件的代码

    public class FileDDWatcher
    {
        #region property && fileds
    
        private Hashtable tempWatchers = null;
        private Queue<string> pathQueue = new Queue<string>();
        private int moveFileCount = 0;
    
        #endregion
    
        #region instance
        private static object ooo = new object();
        private static FileDDWatcher _instance;
        public static FileDDWatcher Instance
        {
            get
            {
                lock (ooo)
                {
                    if (_instance == null)
                    {
                        _instance = new FileDDWatcher();
                    }
                    return _instance;
                }
            }
        }
        private FileDDWatcher() { }
        #endregion
    
        #region method
    
        #region private
    
        /// <summary>
        /// 文件监控触发的事件
        /// </summary>
        /// <returns></returns>       
        private void OnCreated(object source, FileSystemEventArgs e)
        {
            string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "TempDirectory");
            if (e.FullPath.Contains(path))
            {
                return;
            }
            pathQueue.Enqueue(e.FullPath);
        }
    
        #endregion
    
        #region public
    
        /// <summary>
        /// 启动文件监控,传入移动文件的个数,默认是1个
        /// </summary>
        /// <returns></returns>
        public bool StartWatcher(int fileCount = 1)
        {
            LogHelper.WriteInfo("StartWatcher");
            try
            {
                moveFileCount = fileCount;
                int i = 1;
                if (tempWatchers == null || tempWatchers.Count <= 0)
                {
                    tempWatchers = new Hashtable();
                    foreach (string driveName in Directory.GetLogicalDrives())
                    {
                        if (Directory.Exists(driveName))
                        {
                            FileSystemWatcher watcher = new FileSystemWatcher();
                            watcher.Filter = "*.download";
                            watcher.NotifyFilter = NotifyFilters.FileName;
                            watcher.Created -= OnCreated;
                            watcher.Created += OnCreated;
                            watcher.IncludeSubdirectories = true;// 必须要的,监控子集目录
                            watcher.Path = driveName;
                            LogHelper.WriteInfo(driveName);
                            watcher.EnableRaisingEvents = true;
                            tempWatchers.Add("file_watcher" + i.ToString(), watcher);
                            i++;
                        }
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                LogHelper.WriteError(ex.Message);
                return false;
            }
        }
        /// <summary>
        /// 停止文件监控,如果队列中路径数量和文件移动数量一致,就不重置文件传输个数
        /// </summary>
        /// <returns></returns>
        public bool StopWatcher()
        {
            try
            {if (tempWatchers != null && tempWatchers.Count > 0)
                {
                    LogHelper.WriteInfo(tempWatchers.Count + "");
                    for (int i = 1; i <= tempWatchers.Count; i++)
                    {
                        ((FileSystemWatcher)tempWatchers["file_watcher" + i.ToString()]).Dispose();
                    }
                    tempWatchers.Clear();
                    tempWatchers = null;
                }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                moveFileCount = 0;
            }
        }
        /// <summary>
        /// 返回文件保存的路径
        /// </summary>
        /// <returns></returns>
        public string[] GetTempFilePath()
        {
            try
            {
                int length = pathQueue.Count;
                if (length <= 0)
                {
                    return new string[0];
                }
    
                string[] ls = new string[length];
                for (int i = 0; i < length; i++)
                {
                    ls[i] = pathQueue.Dequeue();
                }
                return ls;
            }
            catch (Exception ex)
            {
                return new string[0];
            }
            finally
            {
                moveFileCount = 0;
            }
        }
        #endregion
    
        #endregion
    }
  • 相关阅读:
    P1135 奇怪的电梯
    pycharm设置快捷键在keymap下拉列表没有eclipse怎么办
    记录selenium简单实现自动点击操作
    selenium 批量下载文件,json,重命名
    python3.6+selenium使用chrome浏览器自动将文件下载到指定路径
    selenium + Java 设置文件默认下载路径
    详解介绍Selenium常用API的使用Java语言(完整版)
    Pycharm安装robot framework运行插件
    Python之robotframework+pycharm测试框架!
    基于Python3 Robot framework环境搭建
  • 原文地址:https://www.cnblogs.com/zbfamily/p/11249900.html
Copyright © 2011-2022 走看看