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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值