6

我正在编写用于 WPF 和 Silverlight 的代码。在 C# 中,我可以"#if SILVERLIGHT"用于条件编译,它可以工作。

但是,在 XAML 中,我必须使用完全不同的 XAML 文件,因为某些属性根本不兼容。XAML 文件有 99% 的点赞率,保持它们同步很麻烦。

我想将它们转换为 T4 模板,因此我可以执行以下操作:

<SomeControl <#=ClipsToBounds()#> />

为 WPF 和SilverlightClipsToBounds()生成不同文本的位置。要求是:

  • 处理 XAML 时的智能感知
  • 构建时生成的模板
  • 该项目必须是独立的,并且可以使用 Visual Studio 的库存版本:不接受安装各种 SDK 和 3rd 方编辑器
  • 模板运行的结果不应在源代码管理中。-

我发现我可以更改custom toolXAML 文件,MSBuild:Compile to TextTemplatingFileGenerator并且不会丢失 Intellisense。但是,生成的模板是在设计时生成的。然后在构建时生成似乎是一个很大的痛苦。

有没有人有这种设置的成功经验?

4

2 回答 2

0

只有具有跨平台通用行为的通用用户控件才能放置在 PCL 中,但是,最好的建议是为每个平台保留单独的 xaml 视图。

于 2013-02-06T11:22:33.073 回答
0

由于似乎没有人根据需要建议基于模板的解决方案,因此我将分享一些处理针对 SL/WPF 的项目的经验。许多人会建议使用两个完全独立的 XAML 文件,每个平台使用不同的视图,并且在许多方面这是“纯粹”的做法。但是,如果您想消除重复并降低 2 个目标分开的风险,我当然建议共享 XAML 文件(带有简单的项目链接)可以很好地工作。

有一些常见的不兼容情况:

  • 控件存在于两个平台的不同命名空间中 - 子类化您自己的版本并引用它。
  • 风格等需要在平台之间有所不同 - 包括一个通用的资源字典,每个平台不同,以及按键引用。
  • 控件大不相同,或者仅存在于 1 个平台中 - 引入您自己的包装器控件(在“缺失”的情况下可能需要大量实现)。
  • 缺少基本属性或功能 - 通常可以通过附加行为破坏某些东西(例如,您的 ClipsToBounds 示例可在此处找到)。
于 2013-02-06T13:48:31.300 回答