【问题标题】:Unified XAML for WPF and Silverlight using T4?使用 T4 为 WPF 和 Silverlight 统一 XAML?
【发布时间】:2012-09-12 16:51:43
【问题描述】:

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

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

我想将它们转换成 T4 模板,所以我可以执行以下操作:

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

ClipsToBounds() 为 WPF 和 Silverlight 生成不同的文本。要求是:

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

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

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

【问题讨论】:

  • 不使用可移植类库吗?
  • 可移植类库解决了共享非 UI 代码的问题,如果使用 MVVM,它们应该非常适合 ViewModel 层,而不是视图。

标签: wpf silverlight xaml t4


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    有一些常见的不兼容问题:

    • 两个平台中的控件都存在于不同的命名空间中 - 子类化您自己的版本并引用它。
    • 平台之间的样式等需要有所不同 - 包括一个通用的资源字典、每个平台的不同以及按键引用。
    • 控件大不相同,或仅存在于 1 个平台中 - 引入您自己的包装控件(在“缺失”情况下可能需要大量实现)。
    • 缺少基本属性或功能 - 通常会通过附加行为破坏某些内容(例如,您的 ClipsToBounds 示例位于 here)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      相关资源
      最近更新 更多