将设计时资源排除在构建之外的最佳方法是什么



我们的特定项目是针对Windows Phone的,但我认为这个问题同样适用于所有基于xaml的项目。我们有一堆只在设计时使用的图像资产,不希望它们作为发布版本的一部分。如果可能的话,我们也希望它们不是Debug配置构建的一部分。有人有关于如何做到这一点的最佳实践吗?

一种解决方案是继续在项目中包含图像,但将"构建操作"设置为None。这样做的问题是很容易忘记,因为图像的默认值是将它们包含为Content

从理论上讲,另一种解决方案是将这些映像添加到只在Debug构建中引用的程序集中,但我还没有测试过。我不知道Blend或VS设计器是否能很好地使用该解决方案,而且我们无论如何都不希望将图像作为调试构建的一部分。

我们经常使用DesignTime数据,并将它们从版本构建中排除,

最大限度地提高Visual Designer对设计时数据的使用在最底部有一节"从生产构建中排除设计时数据",它非常适合我们的要求。

摘自以上链接:

从生产构建中排除设计时数据如果小心处理,设计时代码不会对生产应用程序有害(因为它不是在运行时执行的),但从生产构建中排除此代码和所有相应的资产(如图像)仍然是可取的。

为此,您需要通过以下步骤手动修改CSPROJ文件。在当前版本的Visual Studio 2012中,没有其他方法可以做到这一点。

  • 在解决方案资源管理器中右键单击要编辑的项目
  • 从关联菜单中,选择"卸载项目"
  • 右键单击同一项目,然后选择"编辑[项目名称]"
  • 找到要排除的文件,并为每个文件向CSPROJ文件中的XML元素添加一个Condition。例如,DesignFriendsService可以在Release模式下被排除,代码如下所示
  • 关闭CSPROJ文件
  • 在解决方案资源管理器中右键单击卸载的项目

然后选择"重新加载项目"。

<Compile Include="DesignDesignRssService.cs"
         Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "/>

可以在所有设计时文件上设置此条件,包括图片和其他资产。排除的项目在解决方案资源管理器中仍然可见,但它们不会包含在最终的二进制文件中。事实上,如果在排除DesignRssService之后构建解决方案,则ViewModelLocator中会出现编译错误。

必须在预编译器指令中包含使用DesignRssService的代码行,如下所示:

if (ViewModelBase.IsInDesignModeStatic)
{
#if DEBUG
    SimpleIoc.Default.Register<IRssService, Design.DesignRssService>();
#endif
}
else
{
    SimpleIoc.Default.Register<IRssService, RssService>();
}

相关内容

最新更新