XAML条件编译

30 c# xaml conditional compilation

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

Ree*_*sey 23

在XAML中有一些对条件编译的支持.但它与C#代码不同.诀窍是使用AlternateContentRequires反对的东西标记可忽略的.通过执行此操作,您实际上可以根据条件使部分xaml不可用,并打开或关闭.

  • 里德,你能发帖至少一些相关的代码/信息吗?答案不应该只包含*链接. (11认同)

Akk*_*kku 5

我尝试了其他提到的解决方案,它编译并运行,尽管 Visual Studio 会给您带来大量错误,而且对我来说,该解决方案似乎在 UI 线程上使用了大量时间,这两者都是我不喜欢的。

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

我想让条件编译符号影响我的应用程序中的颜色,但您也可以想象将相同的解决方案用于其他不同的样式甚至模板,或者可以将其与通常的 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}" />
Run Code Online (Sandbox Code Playgroud)

可以通过在应用程序中放置 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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