XAML中的"条件编译"?

use*_*117 5 wpf xaml

我们有一个内部程序来测试和验证我们销售的工业控制产品.我们希望能够为某些客户提供缩小版或轻量版的版本.

我们的程序是用C#和WPF(因此是XAML)编写的.使用条件编译功能可以轻松完成仅在我们工厂中使用的C#代码部分,例如:

#if FACTORY
    // our in-house code . . .  
   . . . 
   . . . 
#endif
Run Code Online (Sandbox Code Playgroud)

但是,我们如何为我们计划的XAML部分完成类似的工作?

注意: **有关此主题的Stack Overflow问题,其中某人发布了带有链接的简洁答案,但该链接似乎与该问题无关.因此,不要将其视为重复,因为它不回答问题.* XAML条件编译

slu*_*ter 2

链接的问题/答案中说明的技术可能会在某种程度上对 XAML 元素进行条件处理,但我认为它不会为您提供您想要的东西。

还有另外两个选项可能更适合您的需求:编程条件编译和构建时的条件包含。

对于编程条件编译,您可以在视图后面的代码中使用常规条件编译(最好是,因为它是您正在影响的 UI 元素)或视图模型中(不是那么纯粹,但如果您必须将其包含在多个视图中,则完全可以接受)层)。此条件编译可用于更改从属性返回的值(通过更改编译并执行哪些行)或消除代码块(这很笨重但仍然有效),然后您可以拥有一个 XAML DataTrigger有一个依赖于条件编译代码的表达式

另一个选项是在 XAML 资源文件中指定控制模板,然后以编程方式选择它们,或者在ItemGroup proj 文件的表达式中使用 MSBuild 属性来控制构建中包含哪些文件。与模型/视图模型中的常规编程条件编译相结合,这应该为您的问题提供一个很好的干净解决方案 - 事实上,使用此选项您甚至可能不需要编程条件编译。

TemplateSelector 也可能有帮助,但 IMVHO 它有点肮脏的黑客。TemplateSelector 应该根据type交换模板,但您也可以利用它来包含额外的代码来确定要使用的模板 - 这可能是包含条件编译代码的好地方。