【问题标题】:Invoking standard "File changed outside Visual Studio" dialog调用标准“文件在 Visual Studio 之外更改”对话框
【发布时间】:2012-05-02 11:45:54
【问题描述】:

我已在我的 VSPackage 中成功创建了自定义单视图编辑器。我必须处理的许多事情之一是对在 Visual Studio 外部更改编辑文件时的情况做出反应 - Visual Studio 中的“标准”编辑器显示对话框,其中包含“是”、“对所有”(重新加载内容)等选项,因此,如果更改了更多文件,则只显示一个对话框。

但是,到目前为止,我在 VSPackage 中唯一能做的就是在文件更改时显示自定义对话框。这并不漂亮 - 当我的编辑器中编辑的文件与其他一些文件一起更改时,将向用户显示两个完全不同的对话框。

所以问题是 - 有什么方法可以为我的文件调用“标准”Visual Studio“文件在 VS 之外更改”对话框?

【问题讨论】:

  • hanselman.com/blog/… 这会有帮助吗?
  • 您对角落的情况有点太担心了?否则,您将陷入困境,没有任何事件,也没有方法可以自己调用对话框。
  • 这是一个相当广泛的学校项目,是我的学士论文的一部分——根据我的经验,极端案例只是可能会受到惩罚的事情:-)
  • 我不特别了解 VS,但我过去使用过的其他应用程序在它们被激活时(即当它们从其他地方接收焦点时)检测到这种情况。您可能会尝试的一件事是 - 在将更改的文件写入磁盘之后 - 将焦点短暂设置到 Windows shell,然后再次回到 VS。这可能会触发对话。
  • 500 - 内部服务器错误:感谢您的回答,但似乎我没有说清楚 - 当用户在 VS 的编辑器中打开文件时,这是我的责任(作为编辑provider) 来处理外部 VS 更改。更具体地说,只要文件在外部发生更改,就会调用一种方法(我的方法)。在该方法中,我可以做任何事情(例如,忽略更改)。我需要的是 VS 提供的方法,它会调用它自己的对话框。有焦点的东西会再次运行我自己的方法。

标签: c# .net visual-studio-2008 vsx vspackage


【解决方案1】:

听起来你正在使用IVSFileChangeEx 接口。

这个blog post 可能几乎就是您想要的。通常这用于检查文件是否可以编辑或重新加载,并将提供文件对话框提示(签出或重新加载)。

这使用IVsQueryEditQuerySave2 接口。您可能想调用DeclareReloadableFile,这将“说明如果文件在磁盘上发生更改将重新加载。”

private bool CanEditFile()
{
  // --- Check the status of the recursion guard
  if (_GettingCheckoutStatus) return false;

  try
  {
    _GettingCheckoutStatus = true;

    IVsQueryEditQuerySave2 queryEditQuerySave =
      (IVsQueryEditQuerySave2)GetService(typeof(SVsQueryEditQuerySave));

    // ---Now call the QueryEdit method to find the edit status of this file
    string[] documents = { _FileName };
    uint result;
    uint outFlags;

    int hr = queryEditQuerySave.QueryEditFiles(
      0, // Flags
      1, // Number of elements in the array
      documents, // Files to edit
      null, // Input flags
      null, // Input array of VSQEQS_FILE_ATTRIBUTE_DATA
      out result, // result of the checkout
      out outFlags // Additional flags
      );
    if (ErrorHandler.Succeeded(hr) && (result ==
      (uint)tagVSQueryEditResult.QER_EditOK))
    {
      return true;
    }
  }
  finally
  {
    _GettingCheckoutStatus = false;
  }
  return false;
}

【讨论】:

  • 很抱歉,我无法让它工作。这如何与 IVsFileChangeEx 合作?当文件在 VS 外部更改时,我尝试调用 QueryEditFiles() 和 QuerySaveFile() 方法,返回代码正常,但没有出现对话框。我不确定 IVsQueryEditQuerySave2 是否有能力弹出我想要的弹出窗口。
  • 这可能仅适用于受源代码管理的文件,抱歉。
猜你喜欢
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2010-11-18
相关资源
最近更新 更多