XAML 条件编译

Posted

技术标签:

【中文标题】XAML 条件编译【英文标题】:XAML Conditional Compilation 【发布时间】:2010-11-15 20:40:45 【问题描述】:

有没有一种简单的方法可以在我的 xaml 文件中使用我用于 c# 代码的相同条件编译符号?

【问题讨论】:

见***.com/a/19940157/492 【参考方案1】:

对conditional compilation in XAML 有一些支持。但是,它与 C# 中的代码不同。诀窍是使用AlternateContentRequires 对抗标记为Ignorable 的东西。通过这样做,您实际上可以根据条件使部分 xaml 不可用,并打开或关闭。

【讨论】:

Reed,能否请您至少发布一些相关代码/信息?答案不应包含链接。 我同意。我无法理解该链接的用途。 链接中的示例似乎仅适用于运行时/设计时的选择。我看不出它如何用于根据条件编译符号在几个不同版本的 XAML 之间进行选择。【参考方案2】:

我尝试了另一个提到的解决方案,它编译并工作,即使 Visual Studio 会给你带来很多错误,而且对我来说,这个解决方案似乎在 UI 线程上使用了很多时间,而这两个我都没有不喜欢。

我实施的最佳解决方案是将所有条件逻辑放在控件后面的代码中。由于您没有提及您的意图,这可能就是您要寻找的。​​p>

我想让条件编译符号影响我的应用程序中的颜色,但您也可以想象将相同的解决方案用于其他不同的样式甚至模板,或者这可以与通常的 if-else 逻辑一起使用,而不是编译符号。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                x:Class ="MyApp.Style.MainStyle">

<!--Version1 -->
<Color x:Key="AbMainColor">#068C00</Color>
<Color x:Key="AbLighterMainColor">#5EBD50</Color>
<Color x:Key="AbDarkerMainColor">DarkGreen</Color>

<Color x:Key="MainColor" />
<Color x:Key="LighterMainColor" />
<Color x:Key="DarkerMainColor" />

<!-- Version2 -->
<Color x:Key="OtherRedColor">#EF0000</Color>
<Color x:Key="LighterRedColor">#e62621</Color>
<Color x:Key="DarkerRedColor">#EF0000</Color>

<SolidColorBrush x:Key="MainBrush" Color="DynamicResource MainColor" />
<SolidColorBrush x:Key="LighterMainBrush" Color="DynamicResource LighterMainColor" />
<SolidColorBrush x:Key="DarkerMainBrush" Color="DynamicResource DarkerMainColor" />

可以通过在您的应用程序中放置 MainStyle.xaml.cs 手动创建此代码隐藏,并像这样使用它:

using System.Windows;

namespace MyApp.Style

    partial class MainStyle : ResourceDictionary
    
        public MainStyle()
        
            InitializeComponent();
#if VERSION2
            this["MainColor"] = this["OtherRedColor"];
            this["LighterMainColor"] = this["LighterRedColor"];
            this["DarkerMainColor"] = this["DarkerRedColor"];
#elif VERSION1
            this["MainColor"] = this["AbMainColor"];
            this["LighterMainColor"] = this["AbLighterMainColor"];
            this["DarkerMainColor"] = this["AbDarkerMainColor"];
#endif
        
    

需要注意的是,如果仅引用我的 XAML 代码中未设置的值,并且这也适用于 StaticResources,尽管构造函数只被调用一次。我想覆盖/使用更多的资源字典方法也可以,但这已经解决了我的问题,所以我没有尝试。

【讨论】:

以上是关于XAML 条件编译的主要内容,如果未能解决你的问题,请参考以下文章

从思路开始 Java如何实现条件编译的技巧

rust条件编译

十五宏条件编译和枚举

条件编译在工作当中的应用

条件编译#ifdef的妙用详解_透彻

预处理——条件编译