我有一个程序(C#,。Net 4.5,WPF),它使用来自几个不同路径的文件。为了允许用户浏览到该文件类型的位置,我为每个文件实例化了一个不同的OpenFileDialog,希望每个OpenFileDialog分别跟踪其最后使用的目录。
//Class variables
OpenFileDialog wordFileDlg = new OpenFileDialog();
OpenFileDialog excelFileDlg = new OpenFileDialog();
Dictionary<FILETYPES, OpenFileDialog> fdialogs = new Dictionary<FILETYPES, OpenFileDialog>();
//from Main
wordFileDlg.FilterIndex = 2;
wordFileDlg.RestoreDirectory = true;
wordFileDlg.Title = "Choose Word Document Template";
wordFileDlg.Filter = "All files (*.docx)|*.docx";
excelFileDlg.FilterIndex = 2;
excelFileDlg.RestoreDirectory = true;
excelFileDlg.Title = "Choose Excel or XML Data File";
excelFileDlg.Filter = "All files (*.xls*;*.xml)|*.xls*;*.xml";
wordFileDlg.InitialDirectory = @"d:\downloads-tmp\";
excelFileDlg.InitialDirectory = @"D:\Document\Spreadsheets";
fdialogs[FILETYPES.WORD] = wordFileDlg;
fdialogs[FILETYPES.EXCEL] = excelFileDlg;
//... End Main
private string browseForFile(FILETYPES filetype, out string result)
{
Trace.WriteLine("Using OpenFileDialog with initial dir = " + fdialogs[filetype].InitialDirectory);
DialogResult dr;
dr = fdialogs[filetype].ShowDialog();
result = dr.ToString();
Trace.WriteLine("Dialog result dr= " + dr.ToString()+", type of dr = ");
if (!dr.ToString().Equals("Cancel"))
{
clearWarning();
}
return fdialogs[filetype].FileName;
}
这似乎间歇性地起作用。有时当我从一个文件对话框(wordFileDlg)中选择一个文件时,下次打开另一个文件对话框(excelFileDlg)时,该目录已更改为最后选择的wordFileDlg目录。反过来说不是这样。为什么会这样做?
我将初始目录属性设置为默认值,但即使是最后一个目录似乎也会在会话中保持不变。我将restoreDirectory属性设置为false我打开程序,浏览一些文件并关闭程序。我再次打开程序,浏览器不会将我带到初始目录,而是回到最后选择的目录。怎么知道呢?我似乎无法找到打开特定目录的文件对话框的方法。我已经尝试将RestoreDirectory设置为true和false。
如何让不同的文件对话框记住自己的目录,而不是在会话中保持不变,我可以设置它打开的目录吗?
答案 0 :(得分:0)
我知道这是一个老问题,但我自己偶然发现了类似的问题(虽然更简单)。
我担心你无法真正得到你想要的东西 - 但是你可以很容易地拥有一个字符串变量来存储你应该去的目录。你可以将它封装成一个类,瞧!,你已经得到了你需要的东西。
这是我的班级:
public class PersistentOpenFileDialog
{
OpenFileDialog m_ofd = new OpenFileDialog();
string m_persistentDirectory = null;
public PersistentOpenFileDialog()
{
m_ofd.CheckFileExists = true;
m_ofd.CheckPathExists = true;
m_ofd.ReadOnlyChecked = true;
}
public bool? ShowDialog()
{
if (m_persistentDirectory != null)
{
m_ofd.InitialDirectory = m_persistentDirectory;
}
bool? retval = m_ofd.ShowDialog();
if (retval == true)
{
m_persistentDirectory = new FileInfo(FileName).DirectoryName;
}
return retval;
}
public string FileName
{
get { return m_ofd.FileName; }
set { m_ofd.FileName = value; }
}
}
这是非常基本的 - 它只装饰我严格需要的方法和属性,但你可以轻松添加缺少的东西。
此类确保最后一个目录在同一实例的不同ShowDialog()
之间保持不变;然而,当你关闭程序时,一切都已消失,操作系统将决定你下次启动时会发生什么。通过序列化/反序列化文件或系统注册表来使目录更加持久是很酷的。