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