Вызов стандартного файла изменен за пределами диалогового окна Visual Studio

Я успешно создал настраиваемый редактор единого представления в своем VSPackage. Одной из многих вещей, с которыми мне приходилось сталкиваться, была реакция на ситуацию, когда редактируемый файл был изменен вне Visual Studio — «стандартные» редакторы в Visual Studio отображали диалоговое окно с такими параметрами, как «да», «да для всех» (перезагрузить содержимое) и т. д., поэтому, если было изменено больше файлов, отображается только одно диалоговое окно.

Однако пока единственное, что я могу сделать в своем VSPackage, — это отображать пользовательский диалог при изменении файла. Это некрасиво - когда файл, редактируемый в моем редакторе, изменяется вместе с некоторыми другими, пользователю будут отображаться два совершенно разных диалога.

Итак, вопрос в том, есть ли способ вызвать диалоговое окно «стандартный» файл Visual Studio, измененный вне VS, для моего файла?


person cre8or    schedule 02.05.2012    source источник
comment
hanselman.com/blog/ поможет ли это?   -  person adt    schedule 02.05.2012
comment
Вы слишком беспокоитесь о угловом случае? В противном случае вы довольно застряли, для этого нет события и нет способа вызвать диалог самостоятельно.   -  person Hans Passant    schedule 02.05.2012
comment
Это довольно обширный школьный проект, часть моей бакалаврской работы - по моему опыту, крайние случаи - это как раз то, за что можно оштрафовать :-)   -  person cre8or    schedule 02.05.2012
comment
Я не знаю конкретно о VS, но другие приложения, с которыми я работал в прошлом, обнаруживали это состояние, когда они были активированы (т.е. когда они получали фокус откуда-то еще). Одна вещь, с которой вы можете поэкспериментировать, - после записи измененного файла на диск - ненадолго установить фокус на оболочку Windows, а затем снова вернуться к VS. Это может вызвать диалог.   -  person 500 - Internal Server Error    schedule 08.05.2012
comment
500 - Внутренняя ошибка сервера: спасибо за ваш ответ, но, кажется, я не ясно дал понять - когда пользователь открывает файл в моем редакторе в VS, я несу ответственность (как поставщик редактора) за обработку изменений вне VS . Чтобы быть более конкретным, есть один метод (мой метод), который вызывается всякий раз, когда файл изменяется снаружи. Внутри этого метода я могу делать что угодно (например, игнорировать изменение). Мне нужен метод, предоставляемый VS, который будет вызывать собственный диалог. Вещь с фокусом просто снова запустила бы мой собственный метод.   -  person cre8or    schedule 08.05.2012


Ответы (1)


Похоже, вы используете IVSFileChangeEx интерфейс.

Этот сообщение в блоге может быть почти тем, что вы ищете за. Обычно это используется для проверки того, можно ли редактировать или перезагружать файл, и выдает диалоговое окно с запросом на файл (извлечь или перезагрузить).

При этом используется Интерфейс 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;
}
person gameweld    schedule 19.05.2012
comment
Извините, я не могу заставить его работать. Как это взаимодействует с IVsFileChangeEx? Я попытался вызвать методы QueryEditFiles() и QuerySaveFile(), когда файл изменился вне VS, код возврата был в порядке, но диалоговое окно не появилось. Я не уверен, что у IVsQueryEditQuerySave2 есть возможность вызвать всплывающее окно, которое я хочу. - person cre8or; 20.05.2012
comment
Это может быть только для файлов под контролем источника, извините. - person gameweld; 23.05.2012