将设计时资源保留在构建之外的最佳方法是什么?

时间:2013-07-10 15:23:32

标签: wpf silverlight xaml windows-phone

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

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

理论上,另一种解决方案是将这些图像添加到仅在Debug版本中引用的程序集中,但我尚未测试它。我不知道Blend或VS设计师是否能够很好地使用该解决方案,而且我们宁愿不将这些图像作为Debug构建的一部分。

1 个答案:

答案 0 :(得分:2)

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

Maximizing the Visual Designer’s Usage with Design-Time Data在最底部有一节“从生产构建中排除设计时数据”,它可以很好地满足我们的要求。

从以上链接中提取:

  

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

     

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

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

并选择Reload Project。

<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>();
}