Условная компиляция XAML - PullRequest
30 голосов
/ 31 июля 2009

Есть ли простой способ использовать тот же символ условной компиляции, который я использую для своего кода на c #, в моих файлах xaml?

Ответы [ 2 ]

23 голосов
/ 31 июля 2009

Существует некоторая поддержка условной компиляции в XAML . Это не то же самое, что в C #, хотя код. Хитрость заключается в том, чтобы использовать AlternateContent с Requires против чего-то помеченного Ignorable . Делая это, вы можете на самом деле сделать части вашего xaml недоступными в зависимости от условий, а также включить или выключить их.

2 голосов
/ 01 декабря 2014

Я попробовал другое упомянутое решение, и оно компилируется и работает, даже несмотря на то, что Visual Studio выдаст вам массу ошибок, и мне кажется, что решение использует много времени в потоке пользовательского интерфейса, оба из которых я не использую. t like.

Лучшее решение, которое я реализовал вместо этого, заключалось в том, что я поместил всю условную логику в код позади элемента управления. Поскольку вы не упоминаете о своем намерении, это может быть тем, что вы искали.

Я хотел, чтобы условный символ компиляции влиял на цвета в моем приложении, но вы также можете представить себе такое же решение, которое будет использоваться для других отличающихся стилей или даже шаблонов, или что его можно использовать с обычной логикой 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, и это также работает для StaticResource с, хотя конструктор вызывается только один раз. Я думаю, что перезапись / использование большего количества методов словарей ресурсов также будет работать, но это уже решило мою проблему, поэтому я не пытался.

...