2009-07-31 3 views

ответ

22

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

+8

Рид, можете ли вы разместить хотя бы какой-нибудь соответствующий код/​​информацию? Ответы не должны содержать * просто * ссылку. – NullUserException

+0

Согласен. У меня возникли проблемы с пониманием того, как ссылка была полезна. –

+0

Ссылка была разбита. –

1

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

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

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

Смежные вопросы