将属性InitialDirectory设置为本地和现有文件夹的初始化对话框将被忽略。
对话框始终显示打开文件的最后一个文件夹。
VistaOpenFileDialog dialog = new VistaOpenFileDialog();
dialog.Filter = "JSON Dateien (*.json)|*.json";
dialog.InitialDirectory = "C:\\";
预期的行为:
当InitialDirectory设置为“ C:\”时,VistaOpenFileDialog总是显示C:\的内容。
Windows 10专业版1903 / .Net Framework 4.6
感谢您举报@soulflyman。 但是,我相信这是“正确的”行为,因为它与Windows随附的所有其他应用程序中发生的事情匹配-即,他们记得上次使用的文件夹。
您应该能够使用记事本或绘画来重现相同的内容。
@buildcomplete报告了PR#2的类似问题,因此也许我们需要一种以某种方式覆盖此行为(?)的方法,理想情况下它是不引入重大更改的选择启用设置。
听起来不错,如您所说,我想再定一下就可以了。
我知道默认行为(例如记事本),但是我建议手动设置InitialDirectory时可以更改此行为。
我的假设是InitialDirectory是要在每次显示对话框时至少在该应用程序的此运行实例中显示的目录。 即使关闭并重新启动应用程序,我也没想到会被忽略。
我遇到了同样的问题。
尝试了不同的方式/顺序来设置各种VistaSaveFileDialog属性,但均未成功。 对话框始终忽略InitialDirectoy设置,并使用默认设置。
我确认“ _initialDirectory”已在VistaFileDialog.cs中设置为所需的路径。
从那里,该值进入NativeMethods.cs中的CreateItemFromParsingName(string path)
,然后在COM孔中消失。
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IntPtr pbc, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
public static Interop.IShellItem CreateItemFromParsingName(string path)
{
object item;
Guid guid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"); // IID_IShellItem
int hr = NativeMethods.SHCreateItemFromParsingName(path, IntPtr.Zero, ref guid, out item);
if( hr != 0 )
throw new System.ComponentModel.Win32Exception(hr);
return (Interop.IShellItem)item;
}
此SHCreateItemFromParsingName
方法似乎失败,因为返回的COM对象似乎为null?
我在方法签名中添加了SetLastError = true,并在调用后尝试了Marshal.GetLastWin32Error()
,但它返回0。
虽然许多Windows应用程序确实具有“智能”默认行为来记住您的上一条路径,但是在许多情况下,应用程序的开发人员都希望指定特定的初始目录来帮助用户。 对于我们的应用程序环境,这甚至是默认行为,因为我们的用户希望从/保存到与项目相关的特定目录中。 使用记事本/ paint / word中的“ smart”最后一个目录很烦人,这里没有用。
加: Microsoft.Win32.OpenFileDialog
具有完全相同的属性,并按预期使用它。
我有同样的需求。
您能添加一个允许设置对话框初始目录的设置吗?
谢谢你。
我进入了Ookii库代码。 然后我发现了如何考虑InitialDirectory
属性。
您应将此代码行更改为文件VistaFileDialog.cs
进入方法internal virtual void SetDialogProperties(Ookii.Dialogs.Wpf.Interop.IFileDialog dialog)
更改这段代码
// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
dialog.SetDefaultFolder(item);
}
至
// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
dialog.SetFolder(item);
}
做完了
现在,Ookii对话框将开始进入InitialDirectory
属性。
希望它能有所帮助。
@ gitjsdr26您可以为@augustoproiete创建PR
@nzain ,对不起,我不知道如何在GitHub上执行此操作。
好的,我已经收集了更多信息,以阐明此问题。
我们谈论一个InitialDirectory
属性,就像WPF的OpenFileDialog.InitialDirectory记录的那样。 该文档说:
获取或设置文件对话框显示的初始目录。
Ookii对话框的用户将期望相同的行为,因为该属性具有相同的名称。 我同意,在许多情况下不应设置此属性(记事本等),但这是一个不同的故事。 _If_该属性已设置,它应能按预期工作。
不要将InitialDirectory
与当前调用的IFileDialog::SetDefaultFolder
混淆。 这里的文档说:
如果没有最近使用的文件夹值可用,则将使用的文件夹设置为默认文件夹。
我不确定是否存在这种情况(最近没有可用的文件夹可用)。 设置默认文件夹对我没有任何影响。 如果任何人都需要该功能,则应将其作为DefaultDirectory
属性使用。 这可能是旧时的过时产品-如果有人知道这会在什么时候产生效果,请告诉我。
#2 PR现在开放了两年(!),并暗示了类似的情况。 尽管作者@buildcomplete提到它在他的场景中至少工作了一次。 他的修复程序似乎基于旧代码,但与@ gitjsdr26建议的操作相同:更改调用
IFileDialog::SetDefaultFolder(...)
至IFileDialog::SetFolder(...)
。
我不想浪费时间创建PR(我也将更改这一行)。
@augustoproiete,请让我们知道您对此的看法:)
最有用的评论
虽然许多Windows应用程序确实具有“智能”默认行为来记住您的上一条路径,但是在许多情况下,应用程序的开发人员都希望指定特定的初始目录来帮助用户。 对于我们的应用程序环境,这甚至是默认行为,因为我们的用户希望从/保存到与项目相关的特定目录中。 使用记事本/ paint / word中的“ smart”最后一个目录很烦人,这里没有用。
加:
Microsoft.Win32.OpenFileDialog
具有完全相同的属性,并按预期使用它。