Visual Studio:“此文档由另一个项目打开”

时间:2010-10-25 11:29:17

标签: wpf visual-studio silverlight

我花了大部分时间使用相同的代码库为WPF和Silverlight开发控件。为此,我将现有文件从一个项目(比如说Silverlight)添加到另一个项目(比如WPF)。对于细微差别,我使用预处理器指令,如

#if SILVERLIGHT
...
#else
...
#endif

这些块中的代码显示为灰色,具体取决于您打开文件的项目类型。因此,如果您从Silverlight项目(其中定义了SILVERLIGHT)打开文件,则else部分为灰色,而Intellisense在其中不起作用。

为了让IDE处理WPF部分(具有着色和智能感知支持),您需要从WPF项目中打开该文件。当您尝试这样做时,您会看到一个消息框,指出“此文档由另一个项目打开”,当您单击“确定”时,它会在Silverlight项目的上下文中显示该文件(而不是我想要的内容)查看)。所以我必须关闭文件,再次导航到WPF项目并再次打开文件。这非常非常烦人。

所以问题是:是否有某种设置或附件会使Visual Studio重新打开我双击它的项目中的文件而不是显示那个愚蠢的消息框并向我显示该文件“错误的”项目?

4 个答案:

答案 0 :(得分:4)

现在,我在一个月内发生过两次,而不是在WPF应用程序中。不知道为什么会发生,但在这两种情况下,修复都是清理解决方案,重新启动PC(不只是重新启动Visual Studio),然后构建解决方案。

答案 1 :(得分:2)

通过使用部分类和多个文件,您可以更轻松地使用它:共享链接文件中WPF和Silverlight的共享代码相同,每个包含特定于一个的代码的单独文件或其他(具有相同的方法/属性签名),每个只在其中一个项目中。这样做可以同时打开WPF和Silverlight版本(因为它们是单独的文件),代价是增加了大量额外的文件管理开销。

除此之外,获得一些额外的内存并使用单独的解决方案。

答案 2 :(得分:2)

当我有一个项目包含一个VS解决方案下的其他项目的链接文件时,我突然想到了。当我尝试导航到链接文件中方法的定义时,VS会提示消息此文档由另一个项目打开

要解决此问题,我必须卸载拥有VS解决方案中原始文件的项目。之后在正常时间导航到方法定义并且调试时间不是问题。

答案 3 :(得分:1)

是的,可以使用Visual Studio Shell。

首先实例化EnvDTE80.DTE2对象:

private static EnvDTE80.DTE2 _dte;

public static EnvDTE80.DTE2 DTE
{
    get
    {
        if (_dte == null)
            _dte = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE2;

        return _dte;
    }
}

然后:

// On Document Opening, close the existing instances.
// This event occurs when you double-click file in Solution Explorer.

DTE.Events.DocumentEvents.DocumentOpening += (s, e) =>
{
    if(!DTE.ItemOperations.IsFileOpen(YOURFILENAME))
        return;

    foreach(Window win in DTE.Documents.Cast<Document>()
                         .FirstOrDefault(s => s.FullName == YOURFILENAME).Windows))
        win.Close();
}

// next; VS itself will call DTE.ItemOperatins.OpenFile(YOURFILENAME);

HTH。