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