zoukankan      html  css  js  c++  java
  • WPF中使用文件浏览对话框的几种方式

    WPF本身并没有为我们提供文件浏览的控件, 也不能直接使用Forms中的控件,而文件浏览对话框又是我们最常用的控件之一. 下面是我实现的方式

    方式1: 使用win32控件OpenFileDialog

    1
    2
    3
    4
    5
    6
    7
    Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
    ofd.DefaultExt = ".xml";
    ofd.Filter = "xml file|*.xml";
    if (ofd.ShowDialog() == true)
    {
         //此处做你想做的事 ...=ofd.FileName;
    }

    与之类似的还有 Microsoft.Win32.SaveFileDialog

      

    方式2: 使用Forms中的OpenFileDialog控件

    WPF中是不能直接使用Forms中的控件的,否则会提示找不到Forms名字控件. 如果你仍然要用, 答案便是添加.net 引用reference

    之后就可以像下面一样正常使用Forms中的控件了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    System.Windows.Forms.OpenFileDialog openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
    openFileDialog1.InitialDirectory = "c:\\";
    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    openFileDialog1.FilterIndex = 2;
    openFileDialog1.RestoreDirectory = true;
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        //此处做你想做的事 ...=openFileDialog1.FileName;
    }

     

    类似的有文件夹浏览对话框:

    1
    2
    3
    4
    5
    6
    System.Windows.Forms.FolderBrowserDialog folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();
    System.Windows.Forms.DialogResult result = folderBrowserDialog.ShowDialog();
    if (result == System.Windows.Forms.DialogResult.OK)
    {
        tb_FolderPath.Text = folderBrowserDialog.SelectedPath;
    }

     

    方式三: 使用win32 api

    BOOL WINAPI GetOpenFileName(  __inout  LPOPENFILENAME lpofn)

     

    使用这种方式, 你需要自己实现LPOPENFILENAME结构和对GetOpenFileName方法就行封装:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class OpenFileName
    {
        public int structSize = 0;
        public IntPtr hwnd = IntPtr.Zero;
        public IntPtr hinst = IntPtr.Zero;
        public string filter = null;
        public string custFilter = null;
        public int custFilterMax = 0;
        public int filterIndex = 0;
        public string file = null;
        public int maxFile = 0;
        public string fileTitle = null;
        public int maxFileTitle = 0;
        public string initialDir = null;
        public string title = null;
        public int flags = 0;
        public short fileOffset = 0;
        public short fileExtMax = 0;
        public string defExt = null;
        public int custData = 0;
        public IntPtr pHook = IntPtr.Zero;
        public string template = null;
    }
     
    public class LibWrap
    {
        // Declare a managed prototype for the unmanaged function.
        [DllImport("Comdlg32.dll",SetLastError=true,ThrowOnUnmappableChar=true, CharSet = CharSet.Auto)]
        public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
    }

    之后的工作就是实例化、初始化和方法调用了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    OpenFileName ofn = new OpenFileName();
    ofn.structSize = Marshal.SizeOf(ofn);
    ofn.filter = "Project files\0*.xml";
    ofn.file = new string(new char[256]);
    ofn.maxFile = ofn.file.Length;
    ofn.fileTitle = new string(new char[64]);
    ofn.maxFileTitle = ofn.fileTitle.Length;
    ofn.initialDir = "C:\\";
    ofn.title = "Open Project";
    ofn.defExt = "xml";
    ofn.structSize = Marshal.SizeOf(ofn);
    if (LibWrap.GetOpenFileName(ofn))
    {
        //此处做你想做的事 ...=ofn.file;
    }

     

    方式四: 自己写控件(王道)或者使用第三方控件

     

    第一种方式由于不能自己输入路径, 只能通过鼠标在treeview中进行选择, 十分的不喜欢;第三种稍微复杂;第四种有待考察,听说的第三方有SystemWrapper和WAF; 所以暂时选择第二种.

  • 相关阅读:
    算法
    爬虫--scrapy框架
    Flask--SQLAlchemy
    Flask--WTForms
    Django--model操作
    Odoo10 自定义模块创建
    odoo10 工作流、安全机制、向导
    odoo10 高级视图
    odoo10 onchange、唯一性约束
    Odoo10 模型(结构化的应用数据)、视图(用户界面设计)
  • 原文地址:https://www.cnblogs.com/luluping/p/2605777.html
Copyright © 2011-2022 走看看