WPF中使用文件浏览对话框的几种方式

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

方式1: 使用win32控件OpenFileDialog

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中的控件了

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;
}

 

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

        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方法就行封装:

    [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);
    }

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

        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; 所以暂时选择第二种.

posted @ 2010-08-26 17:21  Gemili  阅读(5151)  评论(1编辑  收藏  举报