自定义打开文件对话框

12

我正在使用C#开发WinForms应用程序。 我想要实现的目标是从用户获取文件,为此我使用了以下代码:

OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
    string sFileName = dlg.FileName;
    //my code goes here
}

现在,一切都正常工作,但我想把3个单选按钮放在同一个对话框中,也就是说,我现在可以从这个对话框中获得两件事情。

string sFileName = dlg.FileName; //same as in case of traditional dialog box
//some thing like this which tells which radio button is selected:
dlg.rbTypes.Selected

我该如何实现这个?


+1 对于这个问题和答案。至少现在我意识到我不想移动那么多的奶酪。我会找到另一种方式,不会打破用户对Windows中正常操作的期望。 - CAD bloke
2个回答

11

是的,这是可能的,我成功地使用SaveFileDialog做了相同类型的自定义,它非常有趣。

按照以下链接:

http://www.codeproject.com/KB/dialog/OpenFileDialogEx.aspx

http://www.codeproject.com/KB/cs/getsavefilename.aspx

http://www.codeproject.com/KB/dialog/CustomizeFileDialog.aspx

我的问题也会帮助你:

更改SaveFileDialog中“保存”和“取消”按钮的默认排列顺序

如何在使用GetSaveFileName创建SaveFileDialog时停止覆盖提示

您必须使用WinAPI,并需要编写您自己的ShowDialog方法来调用其中的GetOpenFileNameWindows函数,而不是调用.net的OpenFileDialog。(请参阅http://msdn.microsoft.com/en-us/library/ms646927%28v=vs.85%29.aspx)。这与编写HookProc过程以及在其中捕获事件(如WM_INITDIALOG,CDN_INITDONE)一起使用将帮助您实现所需的功能。

要添加单选按钮等控件,您需要调用Windows函数,例如CreateWindowExSendMessage...

第二个链接提供了自定义的详细说明...

如有任何澄清,请询问...


真可惜,所有代码项目的链接都失效了 :( - Florian Straub

3

在Windows XP上,您需要使用钩子过程方法和GetOpenFileName API。在Vista及更高版本中,这将导致外观可怕且实用性有限的文件对话框,例如没有搜索功能。在Vista上,您应该使用IFileDialog,并且要自定义对话框,您需要使用IFileDialogCustomize接口。因为新的Vista对话框被公开为COM接口,所以在.net中很容易消耗。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接