• C# WPF:快把文件从桌面拖进我的窗体来!


    • 首发公众号:Dotnet9
    • 作者:沙漠之尽头的狼
    • 日期:202-11-27

    一、本文开始之前

    上传文件时,一般是提供一个上传按钮,点击上传,弹出文件(或者目录选择对话框),选择文件(或者目录)后,从对话框对象中取得文件路径后,再进行上传操作。

    对话框选择文件

    选择对话框代码如下:

    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Title = "选择Exe文件";
    openFileDialog.Filter = "exe文件|*.exe";
    openFileDialog.FileName = string.Empty;
    openFileDialog.FilterIndex = 1;
    openFileDialog.Multiselect = false;
    openFileDialog.RestoreDirectory = true;
    openFileDialog.DefaultExt = "exe";
    if (openFileDialog.ShowDialog() == false)
    {
        return;
    }
    string txtFile = openFileDialog.FileName;
    

    但一般来说,对用户体验最好的,应该是直接鼠标拖拽文件了:

    百度<a href=网盘拖拽上传文件" loading="lazy">

    下面简单说说WPF中文件拖拽的实现方式。

    二、WPF中怎样拖拽文件呢?

    其实很简单,只要拖拽接受控件(或容器)注册这两个事件即可:DragEnterDrop

    先看看我的实现效果:

    拖拽文件进QuickApp中

    Xaml中注册事件

    注册事件:

    <Grid  MouseMove="Grid_MouseMove" AllowDrop="True" Drop="Grid_Drop" DragEnter="Grid_DragEnter">
    

    事件处理方法:

    1. Grid_DragEnter处理方法
    private void Grid_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            e.Effects = DragDropEffects.Link;
        }
        else
        {
            e.Effects = DragDropEffects.None;
        }
    }
    

    DragDropEffects.Link:处理拖拽文件操作

    1. Grid_Drop处理方法

    这是处理实际拖拽操作的方法,得到拖拽的文件路径(如果是操作系统文件快捷方式(扩展名为lnk),则需要使用com组件(不是本文讲解重点,具体看本文开源项目)取得实际文件路径)后,即可处理后续操作(比如文件上传)。

    private void Grid_Drop(object sender, DragEventArgs e)
    {
        try
        {
            var fileName = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
            MenuItemInfo menuItem = new MenuItemInfo() { FilePath = fileName };
    
            // 快捷方式需要获取目标文件路径
            if (fileName.ToLower().EndsWith("lnk"))
            {
                WshShell shell = new WshShell();
                IWshShortcut wshShortcut = (IWshShortcut)shell.CreateShortcut(fileName);
                menuItem.FilePath = wshShortcut.TargetPath;
            }
            ImageSource imageSource = SystemIcon.GetImageSource(true, menuItem.FilePath);
            System.IO.FileInfo file = new System.IO.FileInfo(fileName);
            if (string.IsNullOrWhiteSpace(file.Extension))
            {
                menuItem.Name = file.Name;
            }
            else
            {
                menuItem.Name = file.Name.Substring(0, file.Name.Length - file.Extension.Length);
            }
            menuItem.Type = MenuItemType.Exe;
    
            if (ConfigHelper.AddNewMenuItem(menuItem))
            {
                AddNewMenuItem(menuItem);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    

    三、本文Over

    功能很简单,不求精深,会用就行。

    时间如流水,只能流去不流回。

    • 首发公众号:Dotnet9
    • 作者:沙漠之尽头的狼
    • 日期:202-11-27

    微信公众号:Dotnet9

  • 相关阅读:
    谈谈C++新标准带来的属性(Attribute)
    金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
    核桃编程:前端可观测性建设之路
    AI和大数据结合,智能运维平台助力流利说提升核心竞争力
    Python静态类型解析工具简介和实践
    盛京剑客系列24:极简估值教程——题记
    Echarts——关系图(人民的名义为例,简化)源码
    UVA10020(最小区间覆盖)
    LA4636积木艺术
    LA4636积木艺术
  • 原文地址:https://www.cnblogs.com/etoumao/p/14526182.html
Copyright © 2020-2023  润新知