【问题标题】:How to open new OpenFileDialog automatically in Vista/Win7?如何在 Vista/Win7 中自动打开新的 OpenFileDialog?
【发布时间】:2011-04-22 13:32:37
【问题描述】:

我在 Vista 上,我正在使用 Microsoft.Win32.OpenFileDialog 类。

当我调用ShowDialog() 时,我得到旧的 XP 样式对话框:

如何在 WindowsXP 上获得 新的 Vista 风格的对话框并回退到 旧的

有点隆隆声:

我真的不明白为什么他们没有替换 vista 中的对话框,而是保留了它们。现在旧版应用程序将永远不会打开新对话框,除非更新。

【问题讨论】:

  • 不取决于你当前的系统主题吗?
  • 该项目的目标是哪个版本的 .Net 框架?
  • .NET 3.5 SP1 - 应该没问题
  • 你当前的系统主题是什么?

标签: c# windows-7 windows-vista openfiledialog savefiledialog


【解决方案1】:

您显示的第一个对话框是保存对话框而不是打开对话框。

您只需要这样做:

OpenFileDialog OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "My files (*.myfile)|*.myfile|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
  //openFileDialog1.FileName
}

【讨论】:

  • 对不起,是的,但这个问题对打开和保存对话框都有效。
  • 在装有 VS2008 的 win7 机器上使用上面的代码,我得到了 win7 对话框。你能确认它不适合你吗?
  • hmm 我打开了新项目并尝试了您的代码(在 WPF 中修改了返回值)并且对话框是新类型的。嗯...
  • 也许您在应用配置文件或清单文件中引用了旧的通用控制 dll?
【解决方案2】:

参考 System.Windows.Forms

using System.Windows.Forms

OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ;
openFileDialog1.FilterIndex = 2 ;
openFileDialog1.RestoreDirectory = true ;

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    //Do Stuff
}

【讨论】:

  • 看来我迟到了 :( ...再次。
  • "如何在 WindowsXP 上获得新的 Vista 风格的对话框并回退到旧的对话框?"看来这就是所要求的。不确定“后备”,但无论哪种方式我的答案都有效。
  • 你的代码是正确的,我知道。它会像@Brian R. Bondy 的代码一样打开新的 openfiledalog。但是,Kugel 的问题是关于 openfiledialog 的外观。
  • 实际上这个答案对于我在 .NET 3.5 中的情况似乎是正确的,我可以通过引用 windows.forms 来获得新样式。但我不认为索拉克斯是这个意思。
  • 这就是为什么我确定要包含对 System.Windows.Forms 的引用。 Win32是旧版本。我很高兴能帮上忙。 @Serkan,也许删除你的反对票?
【解决方案3】:

是的,您必须升级到 .NET 4.0 才能获得新对话框。如果您卡在 3.5 上,那么您可以使用 System.Windows.Forms.OpenFileDialog,它确实获得了更新以使用新的 IFileDialog COM 接口。

回退是自动的,但如有必要,您可以使用其 AutoUpgradeEnabled 属性强制使用旧版。事实并非如此,.NET 程序不太可能修改对话框。

【讨论】:

  • 我放在上面的代码甚至可以编译为 2.0 并从 VS2008 编译。你确定它是.NET 框架版本@Kugel 吗?您可以尝试在您的新项目中设置 .NET 框架版本吗?
  • @Brian - 那将是一个奇迹。请务必使用 WPF 程序中使用的 Microsoft.Win32 命名空间。
  • 它可以工作,但我不愿意将 Windows.Forms 包含到 WPF 应用程序中。
  • @Hans:不确定它是否会产生差异,但我引用的是 Winforms 程序。
  • @Kugel - 它不会用 winforms 方式感染你的 WPF 应用程序。该类是原生 Windows 界面的一个非常薄的包装器,只是一堆你不想自己维护的 pinvoke。这取决于你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2012-11-07
  • 2011-07-18
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2012-09-21
相关资源
最近更新 更多