精华内容
下载资源
问答
  • 基于WPF的文本比较

    2013-05-03 15:50:01
    项目中需要一个文本比较器,就是类似于源代码管理的版本比较的那种控件。 在网上搜了很久,也就CSDN里有几个下载像一点。下了一个,资源要的多,还是类型的没有UI,不能直接拿来用。 最后,功夫不负有心人,我在一...
  • 使用WPF实现的简单的文件及文件夹的浏览界面,纯后台C#代码,没有使用XAML。 使用VS2015编译,测试通过。 界面比较简单,但是可行,欢迎大家继续补充。 水平有限,敬请批评。
  • WPF文件选择

    2021-02-04 14:59:05
    WPF文件选择1.选择文件的后台代码:2.选择文件夹 1.选择文件的后台代码: 在wpf框架中使用文件框选择文件比较容易实现,可以直接使用Microsoft.Win32.OpenFIleDialog类,后台代码如下: // 实例化一个文件选择对象 ...

    1.选择文件的后台代码:

    在wpf框架中使用文件框选择文件比较容易实现,可以直接使用Microsoft.Win32.OpenFIleDialog类,后台代码如下:

    // 实例化一个文件选择对象
    Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog();
    dialog.DefaultExt = ".png";  // 设置默认类型
    // 设置可选格式
    dialog.Filter = @"图像文件(*.jpg,*.png,*.tif,*.gif)|*jpeg;*.jpg;*.png;*.tif;*.tiff;*.gif
          |JPEG(*.jpeg, *.jpg)|*.jpeg;*.jpg|PNG(*.png)|*.png|GIF(*.gif)|*.gif
          |TIF(*.tif,*.tiff)|*.tif;*.tiff";
    // 打开选择框选择
    Nullable<bool> result = dialog.ShowDialog();
    if(result == true) {
      string file = dialog.FileName; // 获取选择的文件名
    }
    

    DefaultExt 属性设置的是文件选择的默认类型;Filter属性设置的是文件对话框中的可选文件类型(要注意写法);ShowDialog()方法是弹出文件对话框,该方法返回一个布尔值,成功选择文件就返回true,否则返回false;FileName属性的值为对话框选择的文件绝对路径名。

    2.选择文件夹

    在Winform中使用System.Windows.Forms.OpenFileDialog类选择文件,System.Windows.Forms.FolderBrowserDialog类选择文件夹。而在WPF中,使用Microsoft.Win32.OpenFileDialog只能选择文件,FolderBrowserDialog只能用树型的方式选择文件夹,很不好用;我们可以通过添加winform的引用,在wpf中引用winfom,using System.Windows.Forms; 但是我更喜欢另外一个工具:Windows API Code Pack

    第一步:打开VS的程序包管理器控制台
    在这里插入图片描述

    第二步:输入Install-Package WindowsAPICodePack-Shell获取包

    > Install-Package WindowsAPICodePack-Shell
    

    第三步:后台代码

    using Microsoft.WindowsAPICodePack.Dialogs;
    ...
    ...{
      // 实例化一个文件夹选择对象
      CommonOpenFileDialog dialog = new CommonOpenFileDialog();
      dialog.IsFolderPicker = true; // 只选择文件夹(false时只选择文件)
      CommonFileDialogResult result = dialog.ShowDialog(); // 打开选择框
      if(CommonFileDialogResult.Ok == result) {
        var files = Directory.GetFiles(dialog.FileName, "*.*", SearchOption.AllDirectories).Where(
            s => s.EndsWith(".jpg") || s.EndsWith(".jpeg") || s.EndsWith(".png") || 
            s.EndsWith(".tif") || s.EndsWith(".tiff") || s.EndsWith(".gif") ||
            s.EndsWith(".bmp"));
    }
    

    dialog.FileName为选择的文件夹名,Directory.GetFiles获取的是符合条件的文件(注意写法)

    展开全文
  • WPF 文件管理系统

    千次阅读 2016-04-08 17:50:28
    简介:用WPF开发的一款简单的文件管理系统,主要用到了IO、TreeView、ListView这三样比较基础的东西,由于已有半年没有接触过WPF了,之前一直在开发Unity3D,这次开发也是因为公司需要这么一个简单的东西,所以花了一...

    简介:用WPF开发的一款简单的文件管理系统,主要用到了IO、TreeView、ListView这三样比较基础的东西,由于已有半年没有接触过WPF了,之前一直在开发Unity3D,这次开发也是因为公司需要这么一个简单的东西,所以花了一天半开发出来,刚好回忆下之前的半吊子WPF,所以写这篇博客记录一些控件的使用一些简单的设计,方便下次不用花时间去寻找,也帮助初学者一些经验,虽然我也是初学者。o(^▽^)o。

    一、界面图和效果图
    显示不出来
    界面比较简单,左边就是一个TreeView,右边就是ListView。如果WPF基础好的话,完全可以将这两个控件搞得漂漂亮亮的,不过我就没那个实力了,对WPF的数据绑定是云里雾里的,基本上都是从网上查阅资料和看书,看帮助文档。
    二、界面中”文件夹路径”

    实现的功能:在“文件夹路径”中,可以通过选择的路径,查看该路径下的所有文件
    设计:将此路径存在一个txt文本中,将选择的路径进行保存,这样下次就不用在此进行选择了。
    核心代码:

    放文件夹路径的路径
    string path = AppDomain.CurrentDomain.BaseDirectory + "\\path.txt";
    读取txt文件中的内容,这段代码中放入到窗体的Loading事件中
    try {
                    string filepath = string.Empty;//文件下的路径
                    if(File.Exists(path)) {
                        //如果文件不为空
                        StreamReader sr = new StreamReader(path, Encoding.GetEncoding("utf-8")); //读取数据
                        filepath = sr.ReadToEnd().ToString().Trim();
                        sr.Close();//关闭文件流
                        txtPath.Text = filepath;
    
                        CreateDynIconTreeView(filepath, sformat);
                        Isload = true;
                    }
                }
                catch {
                    MessageBox.Show("读取文件中的数据失败");
                    Environment.Exit(0);//关闭程序;
                }

    当点击选择路径时

    System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog();
    
    if(dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
    txtPath.Text = dialog.SelectedPath;
    }
    //如果路径不为空的话,就将路径指定到文件中
    if(!string.IsNullOrEmpty(txtPath.Text)) {
         if(!Directory.Exists(txtPath.Text)) {
              MessageBox.Show("路径不存在");
              return;
          }
    
        if(File.Exists(path)) {
            //如果文件存在,则删除该文件
            File.Delete(path);
            //之所以删除,怕出现文件重名或者文件占用问题
    }
    
    FileStream fs = new FileStream(path, FileMode.Create);//创建文件
    StreamWriter sw = new StreamWriter(fs);
    sw.WriteLine(txtPath.Text.Trim());
    sw.Close();
    fs.Close();
    
         CreateDynIconTreeView(txtPath.Text.Trim(), sformat);//根据选择的路径,加载TreeView,这里读者可以先不用看
    
               }

    三、界面中的”格式”
    图片:

    实现的功能:根据选择的格式,然后对路径下的所有文件进行重新排列,只显示该格式的所有文件
    设计:这些格式项,是运用了枚举类,类中全部是这些格式,未来如果在进行格式添加时,直接在枚举类中加上即可。不过这个设计还不是最好的,最好的应该是将这些格式写入到一个文件中,如果需要添加其他的格式,直接在文本中添加格式名即可,比较方便,不过有个问题是每个格式对应的图标又是一个问题了,如果要想解决这个办法的话,还需要考虑更多的东西,不过这个系统的重点不是这个,所以完全没必要从这里花费时间,适可而止,以后需要改进的话,在写即可。
    格式下拉列表的枚举类,只截取了部分
    核心代码:

    cmbFormat.Items.Clear();
    
    foreach(var item in Enum.GetValues(typeof(FileFormat))) {
        string strName = Enum.GetName(typeof(FileFormat), item);
        cmbFormat.Items.Add(strName);
    }
    cmbFormat.SelectedIndex = 0;
    //FileFormat是个枚举类,这里是进行对枚举类中各个值进行遍历,然后加入到ComboBox中

    四:TreeView显示文件夹和文件
    功能:根据选择的途径,将路径下的所有文件和文件夹,当选择TreeView子项时的一些基本事件,比如TreeViewItem折叠、展开等等。还有选中某个子项,ListView就显示这个选择子项下的所有文件和文件夹
    设计:需要实现上述功能,首先获取改路径下的所有文件夹和文件,要将这些文件夹和文件已TreeView的形式显示出来。(核心代码与设计一起说明)
    1、根据路径获取所有文件夹和文件

    string[] directories = Directory.GetDirectories(fPath);//根据路径,获取该路径下的文件夹,如果需要获取该路径的所有文件夹的话,就需要递归了。

    if(string.IsNullOrEmpty(format)) {
    files = Directory.GetFiles(fPath, “*”);//所有格式
    }
    else {
    files = Directory.GetFiles(fPath, “*.” + format);//文件格式
    }
    根据格式,搜索路径下的所有该格式的文件

    2、TreeView的显示
    既然路径已经获取到了,现在就需要将路径中的文件夹和文件显示在TreeView中。
    先把重要核心代码贴出来,如果不懂得话,可以去下载源码
    xaml:

    添加一级节点
    DirectoryInfo info = new DirectoryInfo(path);//获取路径目录的文件夹名
                TreeViewItem Nodes = new TreeViewItem() { Header = CreateTreeViewItem1(info.Name) };//TreeView节点的小图标,锦上添花,具体的话可看源码
    ![](http://img.blog.csdn.net/20160408172001079)
    Nodes.Expanded += Node_Expanded;//双击展开
    Nodes.Collapsed += Node_Collapsed;//双击折叠,这两个事件不懂得话。可以去看官方帮助文档
    
    //自定义类,用户纪录每个节点的对象和该节点文件夹的路径,之所以这样子做是因为当鼠标选中某个子项时,获取到该子项的对象,即可获取到对应的路径,这样ListView才会展示改路径下的所有文件和文件夹,如果有更好的办法,请您一定给我留言,我觉得一定有更好的办法,只是限于我对WPF的了解不足。
    
    public List<TVItems> listItems = new List<TVItems>();//定义的一个全局泛型,用于存所有TVItem对象和路径
    TVItems items = new TVItems() {
                    ViewItem = Nodes,
                    path = path
                };
    
    getDirectories(path, Nodes,format);//添加文件夹节点
    getfiles(path, Nodes, format);//添加文件节点
     Nodes.IsExpanded = true;//子项展开
    
     tvMain.Items.Add(Nodes);//将子项添加到TreeView控件中
    
     SetListView(path, format);//加载ListView先把这四行代码贴出来,担心读者没有这几行代码看的云里雾里,虽然我知道思路可能没那么清楚,本人也是第一次写博客,特别是这么长的,请谅解。后面我会对这四行代码有个详细的介绍,就当是先做个铺垫吧!!!o(^▽^)o
    
    添加二级节点
        添加文件夹节点
        getDirectories()方法就是加载路径下的所有文件夹和文件,并且创建一个TreeViewItem,将其加入到上一个TreeViewItem中,这里用到了递归。 format参数就是格式
        private void getDirectories(string fPath, TreeViewItem aNode,string format)
            {
                //读取我选择的路径下的文件和目录
                string[] directories = Directory.GetDirectories(fPath);//文件夹集合
    
    foreach(string pathString in directories) {
                    DirectoryInfo info = new DirectoryInfo(pathString);
                    TreeViewItem Node = new TreeViewItem() {
                        Header = CreateTreeViewItem1(info.Name),
                    };
    
                    TVItems items = new TVItems() {
                        ViewItem = Node,
                        path = pathString
                    };
                    listItems.Add(items);
    
                    //添加节点
                    aNode.Items.Add(Node);
                    aNode.Expanded += Node_Expanded;
                    aNode.Collapsed += Node_Collapsed;
                    //添加文件夹的所有文件
                    getfiles(pathString, Node, format);
    
                    if(Directory.GetDirectories(pathString) != null) {
                        getDirectories(pathString, Node,format);
                    }
                }
            }
        添加文件节点
        private void getfiles(string fPath, TreeViewItem aNode,string format)
            {
                string[] files;
                if(string.IsNullOrEmpty(format)) {
                    files = Directory.GetFiles(fPath, "*");//文件格式
                }
                else {
                    files = Directory.GetFiles(fPath, "*." + format);//文件格式
                }
    
                foreach(string filePath in files) {
                    TreeViewItem Node = new TreeViewItem() { Header = CreateTreeViewItem2(Path.GetFileName(filePath)) };
                    aNode.Items.Add(Node);
                }
            }
            文件节点不需要添加TVItems,为什么呢,之前我说过创建TVItems类的主要目的是为了当鼠标单击TreeView下TreeViewItem节点时,ListView已列表的形式显示该TreeViewItem下的所有节点(文件夹和文件)这里针对的是单击文件夹,如果单击了文件其实意义并不大,因为单击了文件,它一个单体,没必要再ListView中在此显示了。

    五:ListView列表的显示
    功能:ListView列表的主要功能是根据选中的TreeView节点,然后显示该节点下的所有文件和文件夹
    设计:既然需要显示选中节点下的所有文件和文件夹,首先必须知道选中了那个节点(这个简单),其实需要知道选中节点的路径(选中文件夹的路径),所以我设计了一个TVItems类,并且定义了两个属性,就是存储所有文件夹的节点对象和该文件夹的路径

    /// <summary>
        /// 需要加载的ListViewItem项
        /// </summary>
        public class TVItems {
            /// <summary>
            /// TreeView子项
            /// </summary>
            public TreeViewItem ViewItem {
                get; set;
            }
    
            /// <summary>
            /// 该子项的路径
            /// </summary>
            public string path {
                get; set;
            }
    
            public TVItems()
            {
            }
        }

    其实当鼠标单击了TreeView子项时

     private void tvMain_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
            {
                TreeViewItem item = (TreeViewItem)e.NewValue;//获取到选中的TreeViewItem对象
                //根据对象,往泛型中查找这个节点对象,并且获取节点对象所在的类对象,主要用到了泛型中的Find()方法,我也是最近才知道,以前一直都不知道,以前都是用foreach,用foreach查看对象一点都不好,而且效率低,占内存(我是U3D开发),代码可读性差,今天终于找到这个了
                TVItems tvItems = listItems.Find(delegate (TVItems tv) {
                    return (tv.ViewItem.Equals(item));
                });
    
                if(tvItems == null) {
                    return;
                }
                SetListView(tvItems.path, sformat);//设置ListView显示
            }

    既然获取到了鼠标单击TreeView的节点对象了,剩下就简单了,需要知道ListView显示的列是些什么信息,我这里随便显示了一些东西。用到了数据绑定。
    ListView xaml:

    <ListView Name="lvMain" MouseDoubleClick="lvMain_MouseDoubleClick">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Width="30">
                                    <GridViewColumn.Header>
                                        <TextBlock></TextBlock>
                                    </GridViewColumn.Header>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Image Source="{Binding ImgPath}" Width="18"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn Header="文件名" Width="200" DisplayMemberBinding="{Binding Path=Name}"/>
                                <GridViewColumn Header="类型" Width="100" DisplayMemberBinding="{Binding Path=Type}"/>
                                <GridViewColumn Header="大小" Width="100" DisplayMemberBinding="{Binding Path=Size}"/>
                                <GridViewColumn Header="路径" Width="450" DisplayMemberBinding="{Binding Path=Path}"/>
    
                            </GridView>
                        </ListView.View>
    
                    </ListView>
     ListView的数据绑定,对于这个我也不是很了解,所以就不详细说明了,就不误人子弟了,不过还需要定义一个类
    public class LVItem: INotifyPropertyChanged {
            private string _Name;
            private string _Type;
            private string _Size;
            private string _Path;
            private string _ImgPath;
            public string Name {
                get {
                    return _Name;
                }
                set {
                    _Name = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
                }
            }
            public string Type {
                get {
                    return _Type;
                }
                set {
                    _Type = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Type"));
                    }
                }
            }
            public string Size {
                get {
                    return _Size;
                }
                set {
                    _Size = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Size"));
                    }
                }
            }
            public string Path {
                get {
                    return _Path;
                }
                set {
                    _Path = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Path"));
                    }
                }
            }
            public string ImgPath {
                get {
                    return _ImgPath;
                }
                set {
                    _ImgPath = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("ImgPath"));
                    }
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
        }
    OK ListView的准备工作已经做完了。
    运用最重要的东西,定义一个泛型,用来存储这个类的值,也就是ListView列表需要显示的值,这些类的赋值就是根据路径获取到该路径下的所有文件夹和文件,具体可以看源码,或者看前面的,其实也差不多,异曲同工。
    

    listLVItem.Clear();
    lvMain.ItemsSource = null;
    /*
    这里的代码就是获取路径下的文件夹和文件,然后添加到listLVItem泛型中
    */
    lvMain.ItemsSource = listLVItem;
    可能会有疑惑为什么要lvMain.ItemsSource = null;之后又lvMain.ItemsSource = listLVItem;这是因为当我们重新选择路径,或者选择某个节点或者格式限制时,ListView都需要重新刷新,如果不将ItemsSource不为空的话,那么就不会刷新。

    其他的方法
    获取文件夹的大小
    /// <summary>
            /// 获取文件夹的大小
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            long GetDicrectoryLenght(string path)
            {
                if(!Directory.Exists(path)) {
                    return 0;
                }
                DirectoryInfo info = new DirectoryInfo(path);
                long lenght = 0;
                foreach(var fi in info.GetFiles()) {
                    lenght += fi.Length;
                }
                DirectoryInfo[] dis = info.GetDirectories();
                if(dis.Length > 0) {
                    for(int i = 0; i < dis.Length; i++) {
                        lenght += GetDicrectoryLenght(dis[i].FullName);
                    }
                }
                return lenght;
            }
            文件大小
    FileInfo fileInfo = new FileInfo(pathString);
    long len = fileInfo.lenght
    
    TreeView的实现是我参考了另一个WPF开发者,从网上下的一个demo.http://download.csdn.net/detail/xgr66/8585917
    源码下载:http://download.csdn.net/detail/iothua/9485116 下载需要5个资源分。
    
    
    
    
    展开全文
  • WPF实现文件播放功能,正常情况并没有什么问题,但是如果你的程序使用管理员身份启动,你就会发现文件拖放功能就会失效。 这是因为WPF 在不同UAC等级下,是不允许拖放的。 原理很简单,与桌面相关联的进程为...

    WPF实现文件拖放功能,正常情况并没有什么问题,但是如果你的程序使用管理员身份启动,你就会发现文件拖放功能就会失效。

    这是因为WPF 在不同UAC等级下,是不允许拖放的。

    原理很简单,与桌面相关联的进程为 explorer.exe,即 explorer.exe 这个进程启动的方式是非管理员身份,当你的程序使用管理员身份启动时,就会导致拖放失败。

    因为二者的权限不一样,系统不允许不同权限的进程进行通讯,包括进程通讯等操作。

    解决方案:

    方案一(不推荐):让 explorer.exe 也使用管理员身份启动。举例Win7系统只需这样设置下并重启系统即可,如下图:

    这种方案能解决问题,但是你不可能让用户去做这种操作,所以只能算一个解决方案,并不能解决实际的问题。


    方案二:让你的程序使用非管理员启动,程序中需要管理员身份的操作,一般为涉及到注册表操作或驱动操作,可以考虑将这部分操作放到一个服务里单独操作,可以理解为程序分成服务与应用程序两块,需要管理员身份操作的

    功能部分放到服务里实现,界面相关的操作在应用程序里实现。

    这种方案也能解决,并且问题解决的比较彻底,但是项目工程量比较大的情况下,工作量就比较大了,为一个文件拖放的功能,增加了较大的工作量,得不偿失。

     

    方案三:提供一个折中的办法,WPF经过我较长的上网搜索及研究,没有找到合适的办法解决这个问题,但是 WinForm 通过消息Hook却能实现,所以这个折中的办法就是WPF+WinForm来解决这个问题。

     

    下面我们将主要讲解如何使用 WPF+WinForm 解决WPF程序使用管理员身份启动后不能拖放文件的问题。

     

    第一部分:使用 WinForm 解决使用不能拖动的问题,关键代码如下

    ElevatedDragDropManager.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using System.Windows;
    
    public class ElevatedDragDropManager : IMessageFilter
    {
        #region "P/Invoke"
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool ChangeWindowMessageFilterEx(IntPtr hWnd, uint msg, ChangeWindowMessageFilterExAction action, ref CHANGEFILTERSTRUCT changeInfo);
    
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool ChangeWindowMessageFilter(uint msg, ChangeWindowMessageFilterFlags flags);
    
        [DllImport("shell32.dll")]
        private static extern void DragAcceptFiles(IntPtr hwnd, bool fAccept);
    
        [DllImport("shell32.dll")]
        private static extern uint DragQueryFile(IntPtr hDrop, uint iFile, [Out()]
    StringBuilder lpszFile, uint cch);
    
        [DllImport("shell32.dll")]
        private static extern bool DragQueryPoint(IntPtr hDrop, ref POINT lppt);
    
        [DllImport("shell32.dll")]
        private static extern void DragFinish(IntPtr hDrop);
    
        [StructLayout(LayoutKind.Sequential)]
        private struct POINT
        {
            public int X;
    
            public int Y;
            public POINT(int newX, int newY)
            {
                X = newX;
                Y = newY;
            }
    
            public static implicit operator System.Drawing.Point(POINT p)
            {
                return new System.Drawing.Point(p.X, p.Y);
            }
    
            public static implicit operator POINT(System.Drawing.Point p)
            {
                return new POINT(p.X, p.Y);
            }
        }
    
        private enum MessageFilterInfo : uint
        {
            None,
            AlreadyAllowed,
            AlreadyDisAllowed,
            AllowedHigher
        }
    
        private enum ChangeWindowMessageFilterExAction : uint
        {
            Reset,
            Allow,
            Disallow
        }
    
        private enum ChangeWindowMessageFilterFlags : uint
        {
            Add = 1,
            Remove = 2
        }
    
        [StructLayout(LayoutKind.Sequential)]
        private struct CHANGEFILTERSTRUCT
        {
            public uint cbSize;
            public MessageFilterInfo ExtStatus;
        }
        #endregion
    
        public static ElevatedDragDropManager Instance = new ElevatedDragDropManager();
        public event EventHandler<ElevatedDragDropArgs> ElevatedDragDrop;
    
        private const uint WM_DROPFILES = 0x233;
        private const uint WM_COPYDATA = 0x4a;
    
        private const uint WM_COPYGLOBALDATA = 0x49;
        private readonly bool IsVistaOrHigher = Environment.OSVersion.Version.Major >= 6;
    
        private readonly bool Is7OrHigher = (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major > 6;
    
        public void EnableDragDrop(IntPtr hWnd)
        {
            if (Is7OrHigher)
            {
                CHANGEFILTERSTRUCT changeStruct = new CHANGEFILTERSTRUCT();
                changeStruct.cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(CHANGEFILTERSTRUCT)));
                ChangeWindowMessageFilterEx(hWnd, WM_DROPFILES, ChangeWindowMessageFilterExAction.Allow, ref changeStruct);
                ChangeWindowMessageFilterEx(hWnd, WM_COPYDATA, ChangeWindowMessageFilterExAction.Allow, ref changeStruct);
                ChangeWindowMessageFilterEx(hWnd, WM_COPYGLOBALDATA, ChangeWindowMessageFilterExAction.Allow, ref changeStruct);
            }
            else if (IsVistaOrHigher)
            {
                ChangeWindowMessageFilter(WM_DROPFILES, ChangeWindowMessageFilterFlags.Add);
                ChangeWindowMessageFilter(WM_COPYDATA, ChangeWindowMessageFilterFlags.Add);
                ChangeWindowMessageFilter(WM_COPYGLOBALDATA, ChangeWindowMessageFilterFlags.Add);
            }
    
            DragAcceptFiles(hWnd, true);
        }
    
        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == WM_DROPFILES)
            {
                HandleDragDropMessage(m);
                return true;
            }
            return false;
        }
    
        private void HandleDragDropMessage(Message m)
        {
            dynamic sb = new StringBuilder(260);
            uint numFiles = DragQueryFile(m.WParam, 0xffffffffu, sb, 0);
            dynamic list = new List<string>();
    
            for (uint i = 0; i <= numFiles - 1; i++)
            {
                if (DragQueryFile(m.WParam, i, sb, Convert.ToUInt32(sb.Capacity) * 2) > 0)
                {
                    list.Add(sb.ToString());
                }
            }
    
            POINT p = default(POINT);
            DragQueryPoint(m.WParam, ref p);
            DragFinish(m.WParam);
    
            dynamic args = new ElevatedDragDropArgs();
            args.HWnd = m.HWnd;
            args.Files = list;
            args.X = p.X;
            args.Y = p.Y;
    
            if (ElevatedDragDrop != null)
            {
                ElevatedDragDrop(this, args);
            }
        }
    }
    
    public class ElevatedDragDropArgs : EventArgs
    {
        public IntPtr HWnd
        {
            get { return m_HWnd; }
            set { m_HWnd = value; }
        }
        private IntPtr m_HWnd;
        public List<string> Files
        {
            get { return m_Files; }
            set { m_Files = value; }
        }
        private List<string> m_Files;
        public int X
        {
            get { return m_X; }
            set { m_X = value; }
        }
        private int m_X;
        public int Y
        {
            get { return m_Y; }
            set { m_Y = value; }
        }
    
        private int m_Y;
        public ElevatedDragDropArgs()
        {
            Files = new List<string>();
        }
    }

    Form1.cs

    注:需要将Form1窗口的AllowDrop属性设置为false,否则无法拖动文件。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace FileDragDrop
    {
        public partial class FileDragDrop : Form
        {
            public FileDragDrop()
            {
                InitializeComponent();
                //this.AllowDrop设置为false
                this.AllowDrop = false;
                ElevatedDragDropManager filter = new ElevatedDragDropManager();
                //开启拖放功能
                filter.EnableDragDrop(this.Handle);
                //添加消息过滤器
                Application.AddMessageFilter(filter);
                //设置拖放结束回调
                filter.ElevatedDragDrop += this.ElevatedDragDrop;
            }
    
            //拖放结束事件
            private void ElevatedDragDrop(System.Object sender, ElevatedDragDropArgs e)
            {
                try
                {
                    if (e.HWnd == this.Handle)
                    {
                        foreach (string file in e.Files)
                        {
                            //拖动文件
                            MessageBox.Show("ElevatedDragDrop File=" + (file) + "!");
                        }
                    }
                }
                catch (Exception ex)
                {
                    //异常信息
                    MessageBox.Show("ElevatedDragDrop error=" + (ex.TargetSite?.Name) + "!");
                }
            }
        }
    }
    

    最终的效果:

     

    WinForm项目代码链接:https://github.com/zhaobangyu/C-SHAP/tree/WinForm

     

    第二部分:WPF+WinForm的组合使用

    效果图:

     

    WPF+WinForm项目代码链接:https://github.com/zhaobangyu/C-SHAP/tree/WPF/FileDragDrop

     

     

     

    展开全文
  • WPF实现简单的文件浏览界面

    千次阅读 2018-05-16 19:58:24
    使用WPF编写文件浏览界面,做的比较简单。因为没有找到合适的第三方库,所以自己手动写一个简单的先试试。没有使用XAML,纯C#代码实现。主要使用的控件Grid, TreeView, ListView,GridSplitter。 使用了两个简单...

        使用WPF编写文件浏览界面,做的比较简单。因为没有找到合适的第三方库,所以自己手动写一个简单的先试试。没有使用XAML,纯C#代码实现。主要使用的控件Grid, TreeView, ListView,GridSplitter。

        使用了两个简单的文件夹图标,使用了Binding,(这个我也不是特别熟,但是勉强用上了),编写了几个简单的类。参考了网上的一些资料和书籍,先总结如下:


        01、ImagedTreeViewItem类,继承自TreeViewItem

    using System;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Controls;
    using System.Windows.Media;
    
    namespace LocalFileManager
    {
        /// <summary>
        /// 简单的Item类,选中和不被选中用两种图标表示
        /// 内置一个StackPanel,包括一个TextBlock显示文本,图片
        /// </summary>
        public class ImagedTreeViewItem : TreeViewItem
        {
            TextBlock text;
            Image img;
            ImageSource srcSelected, srcUnselected;
    
            /// <summary>
            /// Constructor makes stack with image and text
            /// </summary>
            public ImagedTreeViewItem()
            {
                StackPanel stack = new StackPanel();
                stack.Orientation = Orientation.Horizontal;
                Header = stack;
    
                img = new Image();
                img.VerticalAlignment = VerticalAlignment.Center;
                img.Margin = new Thickness(0, 0, 2, 0);
                stack.Children.Add(img);
    
                text = new TextBlock();
                text.VerticalAlignment = VerticalAlignment.Center;
                stack.Children.Add(text);
            }
    
            /// <summary>
            /// Public porperty for text and images
            /// </summary>
            public string Text
            {
                get { return text.Text; }
                set { text.Text = value; }
            }
    
            public ImageSource SelectedImage
            {
                get { return srcSelected; }
                set
                {
                    srcSelected = value;
    
                    if(IsSelected)
                    {
                        img.Source = srcSelected;
                    }
                }//end of set
            }//end of public Imagesource SelectedItem
    
            public ImageSource UnselectedImage
            {
                get { return srcUnselected; }
                set
                {
                    srcUnselected = value;
                    if(!IsSelected)
                    {
                        img.Source = srcUnselected;
                    }
                }//end of set
            }//end of public ImageSource UnselectedImage
    
            /// <summary>
            /// Event override to set image
            /// </summary>
            /// <param name="e"></param>
            protected override void OnSelected(RoutedEventArgs e)
            {
                base.OnSelected(e);
                img.Source = srcSelected;
            }
    
            protected override void OnUnselected(RoutedEventArgs e)
            {
                base.OnUnselected(e);
                img.Source = srcUnselected;
            }
        }
    }
    

        02、文件夹列表item,继承自ImagedTreeViewItem

    using System;
    using System.IO;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    
    namespace LocalFileManager
    {
        /// <summary>
        /// 文件夹列表item,继承自ImagedTreeViewItem
        /// </summary>
        public class DirectoryTreeViewItem : ImagedTreeViewItem
        {
            DirectoryInfo dir;
    
            //Constructor requires DirectoryInfo object
            public DirectoryTreeViewItem(DirectoryInfo pDir)
            {
                this.dir = pDir;
                Text = pDir.Name;
    
                SelectedImage = new BitmapImage(new Uri("pack://application:,,/img/OPEN.BMP"));
                UnselectedImage = new BitmapImage(new Uri("pack://application:,,/img/CLOSED.BMP"));
            }
    
            /// <summary>
            /// public property to obtain DirectoryInfo
            /// </summary>
            public DirectoryInfo DirInfo
            {
                get { return dir; }
            }
    
            /// <summary>
            /// public mathod to populate wtih items
            /// </summary>
            public void Populate()
            {
                DirectoryInfo[] dirs;
    
                try
                {
                    dirs = dir.GetDirectories();
                }
                catch
                {
                    return;
                }
    
                foreach(DirectoryInfo dirChild in dirs)
                {
                    Items.Add(new DirectoryTreeViewItem(dirChild));
                }
            }
    
            /// <summary>
            /// event override to populate subitem
            /// </summary>
            /// <param name="e"></param>
            protected override void OnExpanded(RoutedEventArgs e)
            {
                base.OnExpanded(e);
    
                foreach(object obj in Items)
                {
                    DirectoryTreeViewItem item = obj as DirectoryTreeViewItem;
                    item.Populate();
                }
            }
        }
    }
    

        03、路径树,继承自TreeView

    using System;
    using System.IO;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    
    namespace LocalFileManager
    {
        /// <summary>
        /// 路径树,继承自TreeView
        /// </summary>
        public class DirectoryTreeView : TreeView
        {
            /// <summary>
            /// Constructor builds
            /// </summary>
            public DirectoryTreeView()
            {
                RefreshTree();
            }
    
            public void RefreshTree()
            {
                BeginInit();
                Items.Clear();
    
                //Obtain the disk drivers
                DriveInfo[] drivers = DriveInfo.GetDrives();
    
                foreach(DriveInfo drive in drivers)
                {
                    char chDrive = drive.Name.ToUpper()[0];
                    DirectoryTreeViewItem item = new DirectoryTreeViewItem(drive.RootDirectory);
    
                    //display ...
                    if(chDrive != 'A' && chDrive != 'B' && drive.IsReady && drive.VolumeLabel.Length > 0)
                    {
                        item.Text = string.Format("{0}  ({1})", drive.VolumeLabel, drive.Name);
                    }
                    else
                    {
                        item.Text = string.Format("{0}  ({1})", drive.DriveType, drive.Name);
                    }
    
                    Items.Add(item);
    
                    if(chDrive != 'A' && chDrive != 'B' && drive.IsReady)
                    {
                        item.Populate();
                    }
                }
    
                EndInit();
            }
        }
    }
    

        04、文件信息类,自定义了几个需要显示的文件的属性

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace LocalFileManager
    {
        /// <summary>
        /// 自定义的文件信息类,用于绑定到ListViewItem中
        /// </summary>
        public class FileInfoDemo
        {
            string strFileName;
            string strFileType;
            string strFileSize;
            string _lastModifyTime;
            string _filePath;
    
            /// <summary>
            /// 文件名
            /// </summary>
            public string FileName
            {
                get { return strFileName; }
                set { strFileName = value; }
            }
    
            /// <summary>
            /// 文件类型
            /// </summary>
            public string FileType
            {
                get { return strFileType; }
                set { strFileType = value; }
            }
    
            /// <summary>
            /// 文件大小
            /// </summary>
            public string Size
            {
                get { return strFileSize; }
                set { strFileSize = value; }
            }
    
            /// <summary>
            /// 最后一次修改时间
            /// </summary>
            public string LastModifyTime
            {
                get { return _lastModifyTime; }
                set { _lastModifyTime = value; }
            }
    
            /// <summary>
            /// 文件所在路径
            /// </summary>
            public string FilePath
            {
                get { return _filePath; }
                set { _filePath = value; }
            }
        }
    }
    

        05、主界面

     ListView lvFileInfo = new ListView();
            public LocalFileManager()
            {
                Title = "LocalFileManager";
    
                //网格布局
                Grid grid = new Grid();
                Content = grid;
    
                //定义3列
                ColumnDefinition coldef = new ColumnDefinition();
                coldef.Width = new GridLength(50, GridUnitType.Star);
                grid.ColumnDefinitions.Add(coldef);
    
                coldef = new ColumnDefinition();
                coldef.Width = GridLength.Auto;
                grid.ColumnDefinitions.Add(coldef);
    
                coldef = new ColumnDefinition();
                coldef.Width = new GridLength(50, GridUnitType.Star);
                grid.ColumnDefinitions.Add(coldef);
    
                //定义文件夹树
                DirectoryTreeView mainTree = new DirectoryTreeView();
                mainTree.SelectedItemChanged += MainTree_SelectedItemChanged;
                grid.Children.Add(mainTree);
                Grid.SetColumn(mainTree, 0);
    
                //分隔条
                GridSplitter splite = new GridSplitter();
                splite.Width = 6;
                splite.ResizeBehavior = GridResizeBehavior.PreviousAndNext;
                grid.Children.Add(splite);
                Grid.SetColumn(splite, 1);
    
                //全局ListView
                lvFileInfo = new ListView();
                grid.Children.Add(lvFileInfo);
                Grid.SetColumn(lvFileInfo, 2);
    
    
                //定义字段,绑定到文件信息类中
                GridView myview = new GridView();
                lvFileInfo.View = myview;
                GridViewColumn mycolun = new GridViewColumn();
                mycolun.Header = "文件名";
                mycolun.Width = 80;
                mycolun.DisplayMemberBinding = new Binding("FileName");
                myview.Columns.Add(mycolun);
    
                mycolun = new GridViewColumn();
                mycolun.Header = "类型";
                mycolun.Width = 80;
                mycolun.DisplayMemberBinding = new Binding("FileType");
                myview.Columns.Add(mycolun);
    
                mycolun = new GridViewColumn();
                mycolun.Header = "大小";
                mycolun.Width = 80;
                mycolun.DisplayMemberBinding = new Binding("Size");
                myview.Columns.Add(mycolun);
    
                mycolun = new GridViewColumn();
                mycolun.Header = "最后修改";
                mycolun.Width = 80;
                mycolun.DisplayMemberBinding = new Binding("LastModifyTime");
                myview.Columns.Add(mycolun);
    
                mycolun = new GridViewColumn();
                mycolun.Header = "路径";
                mycolun.Width = 80;
                mycolun.DisplayMemberBinding = new Binding("FilePath");
                myview.Columns.Add(mycolun);
    
                //右键菜单添加测试
                ContextMenu myContext = new ContextMenu();
    
                MenuItem myMUItem = new MenuItem();
                myMUItem.Header = "下载";
                myMUItem.Name = "Menu01";
                myContext.Items.Add(myMUItem);
    
                myMUItem = new MenuItem();
                myMUItem.Header = "查看";
                myMUItem.Name = "FileLook";
                myMUItem.Click += FileLook_Click;
                myContext.Items.Add(myMUItem);
    
                myMUItem = new MenuItem();
                myMUItem.Header = "刷新";
                myMUItem.Name = "Menu03";
                myContext.Items.Add(myMUItem);
    
                myMUItem = new MenuItem();
                myMUItem.Header = "重命名";
                myMUItem.Name = "Menu04";
                myContext.Items.Add(myMUItem);
    
                myMUItem = new MenuItem();
                myMUItem.Header = "新建文件夹";
                myMUItem.Name = "Menu05";
                myContext.Items.Add(myMUItem);
    
                lvFileInfo.ContextMenu = myContext;
    
            }

        06、当文件夹选择改变时,调用事件查找选择的文件夹下的文件,并显示到ListView中

     /// <summary>
            /// 文件夹树改变时,查找文件夹下是否存在文件,如果存在,则显示
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void MainTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
            {
                DirectoryTreeViewItem item = e.NewValue as DirectoryTreeViewItem;
    
                //stack.Children.Clear();
                lvFileInfo.Items.Clear();
    
                FileInfo[] fileInfos;
    
                try
                {
                    fileInfos = item.DirInfo.GetFiles();
                }
                catch
                {
                    return;
                }
    
                foreach(FileInfo info in fileInfos)
                {
                    FileInfoDemo myFile = new FileInfoDemo();
                    myFile.FileName = info.Name;
                    myFile.Size = info.Length.ToString();
                    myFile.LastModifyTime = info.LastAccessTime.ToString();
                    myFile.FilePath = info.DirectoryName;
                    myFile.FileType = info.Extension;
    
                    lvFileInfo.Items.Add(myFile);
                }
            }

        完成代码请见:https://download.csdn.net/download/kakaluote81/10418964


        水平有限,欢迎指正批评。

    展开全文
  • 在很多情况下,我们希望对一些比较私密的文件进行加密,当自己需要查看的时候,再解密出来。因此,今天与大家分享一款自己以前用WPF开发的文件加密解密软件。 准备工作 开发环境:VisualStudio2019;项目类型:WPF...
  • WPF大量的实例.rar

    2019-06-17 09:07:07
    WPF实例(实例比较多) (wpf窗体继承)RibbonStyle2.zip (赛车游戏)GrandPrix_SRC.zip CustomRulesMVVM.zip ExifCompareSource.zip Explorer3D.zip familyshow-12528.zip Jigsaw.zip Life_src.zip PhotoBooth.zip ...
  • WPF 之 style文件的引用

    2019-02-26 19:43:48
    WPF 之 style文件的引用  总结一下WPF中Style样式的引用方法。 一、内联样式:  直接设置控件的Height、Width、Foreground、HorizontalAlignment、VerticalAlignment等属性。  以设置一个Botton控件的样式为例,...
  • Winform和WPF简单对比

    千次阅读 2021-01-21 14:26:00
    如果要新建一个窗口文件WPF中为Windows或者UserControl,文件以.xaml和.cs结尾。但在winform中,则需新建一个Windows Forms文件文件以.cs结尾,但在里面会自动包含.Designer.cs和.resx文件。 其对应关系大致如下...
  •  WPF下主要有两个音频控制的类,这里做下比较: 1.SoundPlayer 2.MediaPlayer 派生MediaElement一.SoundPlayer类 1.基于.NET FRAMEWORK 2.0; 2.可播放WAV音频文件; 3.只能播放一个文件,同时播放多个文件...
  • 这里上传一本比较清晰的wpf深入浅出pdf,以帮助需要的同学
  • 请查看文档,此难题比较隐晦,经过努力详细比对才发现的!赶快顶起吧!!
  • 对于简单 WPF 程序,我们通常可以直接拷贝 [Project Sub]\bin\Debug 下程序主 exe 文件就可以到其他机子使用了,当然前提是机子要已经装了对应的 .Net Formework 版本库 但是有时候我们会在项目引入其他第三方库(非...
  • 一、文件的作用: *.exe 生成的可运行exe文件 *.exe.config 它的内容是依据app.config文件生成的,app.config是开发时的配置文档,*.exe.config是程序布署时的配置文件 *.pdb pdb对应的英文解释是 ...
  • 然而网上的关于WPF的资料少之又少,甚至连基本的文件选择操作,百度搜索的首页都没有一个比较好的方法。所以,踩了几个坑之后,我把我得到的方法分享给大家。  首先,在WPF的代码页面引入winform用的命令空间using...
  • WPF+WCF大文件上传控件

    热门讨论 2012-01-02 12:01:48
    WPF+WCF做的大文件上传控件,在WPF客户端把大文件分割成二进制数组,每次往服务器上写100K,可断点续传。页面做的比较丑,没认真设计,只为实现功能。另外还有一个Silverlight+WCF版的。
  • 感觉WinForm和WPF控件属性方法差别很大,我真觉得微软公司都是一群高智商,有足够的时间来干闲事的人,虽然都是一娘生的,但是差别怎么这么大咧! 废话不多说了,我们进入正题 首先来看WinFrom的RichTextBox对...
  • WPF文件加载字体

    2018-12-25 01:02:00
    原文:WPF文件加载字体 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问。如果当前博客图片看不到,请到 http://lindexi.gitee.io 访问博客。本文地址 ...
  • WPF c# 拓扑图 网络部署图源码, 左边拖拽到右边 进行连线,做了个小demo 代码百分百可以用的 ~ ~ 没有visio 那么强大 但是足够学习了,用cavas 画的
  • JavaFX如何与WPF比较

    2021-03-15 19:06:54
    这里是一个高级别的概述,如何与我的眼中的WPF比较:我的所有意见都与JavaFX 2.0相关。该信息可能会随着平台仍然相当不成熟并正在积极开发而发生变化。图形像WPF一样,JavaFX使用保留的图形渲染系统。用户界面包括由...
  • WPF INI文件的创建与使用

    千次阅读 2015-08-28 18:11:09
    WPF里面简单的使用INI文件
  • WPF中读取txt文件并让其在RichTextBox中显示  出于项目的需要,本来想直接将内容写在RichTextBox中,不过考虑到灵活性,我想,不管是谁,都会想把内容写在一个文件里,然后去读取它以实现这个效果。我也是这么想的...
  • WPF App.config配置文件的使用说明

    千次阅读 2018-11-01 11:53:14
    先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。 常见配置文件模式: <configSections> //配置节声明区域,包含配置节和 命名空间 声明 <section> ...
  • C# WPF 读写Excel文件

    万次阅读 热门讨论 2015-11-10 16:34:33
    关于C#读写Excel文件的方法,在网上查来查去大致有三种  1.利用 Microsoft.Office.Interop.Excel提供的API进行读写,由于兼容性比较差等原因,本人搞了半天之后放弃了。  2.利用OpenXML库进行读写,由于感觉...
  • 支持更新程序包文件验证(比较文件MD5代码) 支持区分x86和x64程序 支持更新程序的版本号 支持执行更新策略 用法: 程序启动需要6个参数 当前版本号(0.9.0.0) 升级版本号(1.0.0.0) 更新描述URL( ) 更新...
  • WPF简单实现数据可视化,效果图类似matlab中plot3绘制出的图形,代码中含有三维曲面显示,三维条状图显示等
  • 是数科、福昕以外,第三个比较完备的阅读器。完全免费使用! 本程序功能特点:1可以直接将ofd转换为pdf或图片。2 屏幕截图。 加入QQ群877371250,可获取最新软件版本! 本公司专注ofd相关技术研究,可为你提供完善...
  • 软件中使用到了网上开放源码的WPF豆瓣音乐播放器中对Bass.Net进行二次封装的库文件,很感谢原作者的无私奉献。 目前这款个人播放实现的功能有: 1、支持常见音频文件播放。快进,曲目切换,播放暂停控制等基本功能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,675
精华内容 5,470
关键字:

wpf文件对比