4

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

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

从理论上讲,另一种解决方案是将这些图像添加到仅在 Debug 构建中引用的程序集中,但我尚未对其进行测试。我不知道 Blend 或 VS 设计器是否能很好地与该解决方案配合使用,而且我们宁愿不将图像作为调试构建的一部分。

4

1 回答 1

3

我们大量使用DesignTime数据并将它们从发布版本中排除,

使用设计时数据最大化可视化设计器的使用在最底部有一个部分“从生产构建中排除设计时数据”,它可以很好地满足我们的要求。

摘自以上链接:

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

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

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

并选择重新加载项目。

<Compile Include="Design\DesignRssService.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>();
}
于 2013-07-10T15:40:54.077 回答