使用T4的WPF和Silverlight统一XAML?

时间:2012-09-12 16:51:44

标签: wpf silverlight xaml t4

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

但是,在XAML中,我必须使用完全不同的XAML文件,因为某些属性只是不兼容。

表示XAML文件与99%相似,并保持同步。

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

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

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

  • 在处理XAML时的智能感知
  • 在构建时生成的模板
  • 该项目必须是自包含的并且在Visual Studio的库存版本上工作:安装各种SDK和第三方编辑器不是 上可接受的
  • 模板运行的结果不应该在源代码管理中。 -

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

有一些常见的不兼容性:

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